使用三元运算符从函数返回的统一初始化

Áti*_*ves 2 c++ ternary-operator uniform-initialization c++11

我不知道这是编译器错误(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;
}
Run Code Online (Sandbox Code Playgroud)

And*_*owl 5

大括号本身不构成表达式(尽管初始化列表的所有元素都是表达式)。花括号初始化器列表只是一种语言结构,可用于在 C++11 标准第 8.5.4 节(包括return语句)指定的上下文中进行初始化。

如果您希望您的return语句编译并仍然使用三元运算符列表初始化,您必须以这种方式重写它:

return { i == 3 ? i + 2 : i };
Run Code Online (Sandbox Code Playgroud)

但是请注意,上述内容不是必需的。正如 David Rodriguez - dribeas 在评论中提到的那样),您可以放弃使用列表初始化。这将同样有效:

return i == 3 ? i + 2 : i;
Run Code Online (Sandbox Code Playgroud)

  • 或者,完全删除“{}”。 (2认同)