[英]Wrong std::vector constructor
我在编译应该是一个简单的代码行时从Clang得到一个奇怪的错误。
此代码产生错误:
size_t s = 5;
std::vector<double> bestScores{s, -1.0};
我只是尝试使用构造函数#2来填充具有五个-1.0值的新向量。 我得到的错误是非常量表达式不能从初始化列表中的类型'size_type'(又名'unsigned long')缩小到'double' 。
到底是怎么回事? 编译好:
std::vector<double> bestScores{5, -1.0};
它是否尝试使用初始化列表构造函数? 我认为你需要两个花括号:
std::vector<double> bestScores{{5, -1.0}};
问题是您使用括号括起的初始化列表构造向量。 这适用于std::initializer_list<T>
构造函数。 在这种情况下, size_t
, -1.0
列表与std::initializer_list<double>
兼容,因此构造函数被选中。 您需要使用旧式的C ++ 03构造:
std::vector<double> bestScores(s, -1.0);
这是支撑封闭初始化器的问题之一。 它们不适合某些标准库容器实例化。 你必须记住std::initializer_list
构造函数将胜过其他构造函数。
问题是当一个类有一个std::initializer_list
构造函数时,如果参数可以转换为initializer_list的类型(在这种情况下是double
),那么在使用统一初始化语法时它会更喜欢。 请参阅programmers.stackexchange.com上的详细解答。
目前,您的解决方案是使用使用括号的非统一语法。 这意味着它不会考虑std::initializer_list
构造函数,并在这种情况下执行您想要的操作。
std::vector<double> bestScores(s, -1.0)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.