我不知道这是否是编译器错误(Arch Linux上的gcc 4.8)或标准问题,但下面的代码无法编译。为什么允许getFoo1但不允许getFoo2?
struct Foo {
int _i;
Foo(int i):_i(i) { }
};
Foo getFoo1(int i) {
if(i == 3) {
return { i + 2 };
} else {
return { i };
}
}
Foo getFoo2(int i) {
return i == 3 ? { i + 2 } : { i };
}
int main() {
auto foo1 = getFoo1(3); //fine
auto foo2 = getFoo2(3); //oops
return 0;
}
答案 0 :(得分:4)
大括号本身不会形成表达式(尽管初始化列表的所有元素都是表达式)。 braced-init-list 只是一种语言结构,可用于在C ++ 11标准的第8.5.4节(包括return
语句)指定的上下文中进行初始化。
如果您希望编译return
语句并仍然使用列表初始化的三元运算符和,则必须以这种方式重写它:
return { i == 3 ? i + 2 : i };
但请注意,上述内容不是必需的。 As mentioned by David Rodriguez - dribeas in the comments),你可以放弃使用列表初始化。这同样有效:
return i == 3 ? i + 2 : i;