【问题标题】:Why is the brace-or-equal initializer brace-or-equal? [duplicate]为什么大括号或等于初始化器是大括号或等于? [复制]
【发布时间】:2015-08-11 13:29:16
【问题描述】:
#include <iostream>
#include <vector>

struct S {
    //std::vector<int> ns(1); //ERROR!
    std::vector<int> ns = std::vector<int>(1);
};

int main() {
    S s;
    std::cout << (s.ns[0] = 123) << std::endl;
    return 0;
}

使用括号初始化器似乎是一个错误。这背后的目的是什么。

【问题讨论】:

    标签: c++


    【解决方案1】:

    我们的想法是彻底拒绝任何可能被解释为函数声明的语法。例如,

    std::vector<int> ns();
    

    是一个函数声明。这些不是:

    std::vector<int> ns{};
    std::vector<int> ns = std::vector<int>();
    

    为了保持一致,任何成员声明都使用这种形式

    T t(args...);
    

    是不允许的,这样可以避免重复最令人头疼的解析惨败。

    【讨论】:

    • 你为什么要写T t();而不是T t;
    • @xiver77 这是值初始化与默认初始化。如果T 是内置类型,或者是具有内置成员的聚合,则不同:值初始化会导致零初始化,而默认初始化不会。
    猜你喜欢
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 2014-12-02
    • 2018-05-31
    • 2010-12-29
    相关资源
    最近更新 更多