在编译应该是简单的代码行时,我从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}};
答案 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)