来自initializer_list的三元运算符+ C ++ 11构造函数

时间:2012-04-02 19:35:58

标签: c++ constructor c++11 ternary-operator initializer-list

在开发应用程序时,我遇到了以下问题。我想在给定的函数指针为null时返回空std::list<string>,否则返回该函数的结果。这是我的代码的简化版本:

typedef std::list<std::string> (*ParamGenerator)();

std::list<std::string> foo() {
    /* ... */
    ParamGenerator generator = ...;
    if(generator)
        return generator();
    else
        return {};
}

但是,在这些情况下,我通常喜欢使用三元(?:)运算符,因此我尝试以这种方式使用它(像往常一样):

return generator ? generator() : {};

但得到了这个错误:

somefile.cpp:143:46: error: expected primary-expression before ‘{’ token
somefile.cpp:143:46: error: expected ‘;’ before ‘{’ token

这是否意味着我不能使用三元运算符来返回使用initializer_list构造函数创建的对象?这有什么特别的原因吗?

4 个答案:

答案 0 :(得分:17)

标准写入8.5.4.1:列表初始化

  

注意:可以使用列表初始化

     
      
  • 作为变量定义中的初始化程序(8.5)
  •   
  • 作为新表达式(5.3.4)
  • 中的初始值设定项   
  • 在退货声明(6.6.3)
  • 中   
  • 作为函数参数(5.2.2)
  •   
  • 作为下标(5.2.1)
  •   
  • 作为构造函数调用的参数(8.5,5.2.3)
  •   
  • 作为非静态数据成员的初始化程序(9.2)
  •   
  • 在mem-initializer(12.6.2)
  • 中   
  • 位于作业的右侧(5.17)
  •   

他们中没有一个是三元运算符。更简约的return 1?{}:{};也是无效的,你想要的是不可能的。

当然,您可以显式调用构造函数std::list<std::string>{},但我建议您像以前一样写出if - else - 块。

答案 1 :(得分:6)

当你执行{}时,编译器不知道你期望的类型,所以它只是一个无意义的表达式,编译器不知道该怎么做。 :的两边都是单独计算的,只有这样,如果类型不匹配,编译器才会抱怨。我会这样做:

return generator ? generator() : std::list<std::string>();

答案 2 :(得分:2)

如果您真的喜欢三元运算符,可以尝试这样的方法:

return generator ? generator() : decltype(generator()) { "default value", "generator was empry" };

即使您稍后更改返回类型也会有效。

答案 3 :(得分:0)

另一种可能性是为条件运算符定义包装函数:

template<class T> T& conditional(bool b, T&x, T&y) { return b ? x : y; }
template<class T> const T& conditional(bool b, const T&x, const T&y) { return b ? x : y; }

可以让您打电话:

return conditional(generator, generator(), {});
相关问题