使用三元操作符从函数返回统一初始化

Uniform initialization with ternary operator return from function

本文关键字:函数 返回 初始化 操作符 三元      更新时间:2023-10-16

我不知道这是编译器错误(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;
}

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

如果你想编译你的return语句,并且仍然使用三元操作符的列表初始化,你必须这样重写它:

return { i == 3 ? i + 2 : i };
但是,请注意,上述内容不是必需的。正如David Rodriguez(评论中的dribeas)所提到的,你可以放弃使用列表初始化。这也同样有效:
return i == 3 ? i + 2 : i;