我在编译应该是一个简单的代码行时从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构造函数将胜过其他构造函数.
问题在于,当类具有std::initializer_list构造函数时,如果参数可转换为initializer_list的类型(double在这种情况下),则它更倾向于使用统一的初始化语法。看到了详细的解答programmers.stackexchange.com。
目前,您的解决方案是使用使用括号的非统一语法。这意味着它将不考虑std::initializer_list构造函数,并且在这种情况下将执行您想要的操作。
std::vector<double> bestScores(s, -1.0)
| 归档时间: |
|
| 查看次数: |
320 次 |
| 最近记录: |