错误的std :: vector构造函数

时间:2014-04-23 21:07:38

标签: c++ c++11 stl

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

此代码产生错误:

size_t s = 5;
std::vector<double> bestScores{s, -1.0};

我只是试图用constructor #2填充一个带有五个-1.0值的新向量。我得到的错误是非常量表达式不能从初始化列表中的'size_type'(又名'unsigned long')缩小到'double'。

发生了什么事?编译好了:

std::vector<double> bestScores{5, -1.0};

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

std::vector<double> bestScores{{5, -1.0}};

2 个答案:

答案 0 :(得分:9)

问题是您正在使用括号括起的初始化列表构造向量。这适用于std::initializer_list<T>构造函数。在这种情况下,size_t-1.0列表与std::initializer_list<double>兼容,因此选择构造函数。您需要使用旧式的C ++ 03构造:

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

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

答案 1 :(得分:5)

问题是,当一个类有一个std::initializer_list构造函数时,如果参数可以转换为initializer_list的类型(在这种情况下为double),那么在使用统一初始化语法时会更喜欢。请参阅 programmers.stackexchange.com的详细答案。

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

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