为什么支撑或相等的初始化器支撑或相等?

xiv*_*r77 3 c++

#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;
}
Run Code Online (Sandbox Code Playgroud)

使用括号初始值设定项似乎是一个错误.这背后的目的是什么?

jua*_*nza 8

我们的想法是拒绝任何可以解释为函数声明的语法.例如,

std::vector<int> ns();
Run Code Online (Sandbox Code Playgroud)

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

std::vector<int> ns{};
std::vector<int> ns = std::vector<int>();
Run Code Online (Sandbox Code Playgroud)

为了保持一致性,使用此表单的任何成员声明

T t(args...);
Run Code Online (Sandbox Code Playgroud)

是不允许的,这避免了最令人烦恼的解析惨败的重复.

  • @ xiver77这是值初始化与默认初始化.如果`T`是内置类型,或者是内置成员的聚合,则会产生不同:值初始化导致零初始化,而默认初始化则不然. (2认同)