错误的std :: vector构造函数

Bri*_*don 3 c++ stl c++11

我在编译应该是一个简单的代码行时从Clang得到一个奇怪的错误.

此代码产生错误:

size_t s = 5;
std::vector<double> bestScores{s, -1.0};
Run Code Online (Sandbox Code Playgroud)

我只是尝试使用构造函数#2来填充具有五个-1.0值的新向量.我得到的错误是非常量表达式不能从初始化列表中的类型'size_type'(又名'unsigned long')缩小到'double'.

到底是怎么回事?编译好:

std::vector<double> bestScores{5, -1.0};
Run Code Online (Sandbox Code Playgroud)

它是否尝试使用初始化列表构造函数?我认为你需要两个花括号:

std::vector<double> bestScores{{5, -1.0}};
Run Code Online (Sandbox Code Playgroud)

jua*_*nza 10

问题是您使用括号括起的初始化列表构造向量.std::initializer_list<T>在适用时,这有利于构造函数.在这种情况下,size_t,-1.0列表与兼容std::initializer_list<double>,使构造得到回升.您需要使用旧式的C++ 03构造:

std::vector<double> bestScores(s, -1.0);
Run Code Online (Sandbox Code Playgroud)

这是支撑封闭初始化器的问题之一.它们不适合某些标准库容器实例化.你必须记住,std::initializer_list构造函数将胜过其他构造函数.


Dav*_*e S 5

问题在于,当类具有std::initializer_list构造函数时,如果参数可转换为initializer_list的类型(double在这种情况下),则它更倾向于使用统一的初始化语法。看到了详细的解答programmers.stackexchange.com

目前,您的解决方案是使用使用括号的非统一语法。这意味着它将不考虑std::initializer_list构造函数,并且在这种情况下将执行您想要的操作。

std::vector<double> bestScores(s, -1.0)