为什么花括号或等号初始化器要使用花括号或等号?

3
#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;
}

使用括号初始化可能会导致错误。它的目的是什么?
1个回答

10
想法是彻底拒绝任何可能被解释为函数声明的语法。例如,
std::vector<int> ns();

是一个函数声明。以下内容不是函数声明:

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

为了保持一致性,所有具有此形式的成员声明
T t(args...);

禁止使用 disallowed,这避免了最令人烦恼的解析问题的重复发生。


1
为什么你会写 T t(); 而不是 T t; - user3810155
3
这里涉及到值初始化和默认初始化。如果T是一个内置类型,或者是一个具有内置成员的聚合体,则会有所不同:值初始化会导致零初始化,而默认初始化则不会。 - juanchopanza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接