【问题标题】:Uniform initialization with ternary operator return from function从函数返回三元运算符的统一初始化
【发布时间】:2013-05-14 06:07:04
【问题描述】:

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

【问题讨论】:

    标签: c++ c++11 ternary-operator uniform-initialization


    【解决方案1】:

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

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

    return { i == 3 ? i + 2 : i };
    

    但请注意,上述内容不是必需的。 As mentioned by David Rodriguez - dribeas in the comments),你可以放弃使用列表初始化。这同样适用:

    return i == 3 ? i + 2 : i;
    

    【讨论】:

    • 或者,完全放弃{}
    • @DavidRodríguez-dribeas:对
    • 我贴了上面的代码来隔离问题,但我觉得太简单了。构造函数有多个参数或根本没有参数怎么办?
    • @ÁtilaNeves:我不确定我是否理解您的问题,但如果您发布的问题不代表您遇到的问题,我恳请您接受这个答案并发布一个新问题一个更有代表性的例子
    • 很公平。我可能会发布另一个问题。谢谢!
    猜你喜欢
    • 2023-01-02
    • 1970-01-01
    • 2010-12-20
    • 2013-07-27
    • 2021-07-03
    • 2013-03-30
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多