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

mfo*_*ini 24 c++ constructor ternary-operator initializer-list c++11

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

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

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

但是,我通常喜欢?:在这些情况下使用ternary()运算符,所以我尝试这样使用它(像往常一样):

return generator ? generator() : {};
Run Code Online (Sandbox Code Playgroud)

但得到了这个错误:

somefile.cpp:143:46: error: expected primary-expression before ‘{’ token
somefile.cpp:143:46: error: expected ‘;’ before ‘{’ token
Run Code Online (Sandbox Code Playgroud)

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

ipc*_*ipc 18

标准写入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-block,就像你已经做的那样.


spe*_*rcw 7

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

return generator ? generator() : std::list<std::string>();
Run Code Online (Sandbox Code Playgroud)