【发布时间】:2020-02-04 10:22:26
【问题描述】:
我有一个问题,即在使用 VS2017(C++14、C++17 和 ISO 最新版本)时,我无法将某个构造函数与数组初始值设定项一起使用。
当它应该使用填充了单个元素的容器调用构造函数时,我收到 C2397 conversion from 'double' to 'unsigned int' requires a narrowing conversion 错误。
#include <vector>
class obj
{
public:
obj(const std::vector<double>& values, unsigned int stride)
: values_(values), stride_(stride)
{
}
obj(unsigned int m, unsigned int n)
: stride_(n)
{
}
private:
unsigned int stride_;
std::vector<double> values_;
};
int main(int argc, char** argv)
{
obj m(1, 1); // correct constructor called.
obj mm({ 42.0 }, 1); // Error C2397
return 0;
}
我可以通过明确声明容器来解决这个问题...
obj mm(std::vector<double>({ 42.0 }), 1);
或者用多个项目初始化容器...
obj mm({ 42.0, 12.0 }, 1);
后者显然没有用,前者有点烦人,因为它是带有单个物品的容器的角落案例(尽管不是世界末日)。我认为这可能仅对双精度数(没有文字声明)有问题,但是在用文字初始化浮点数时甚至会发生这种情况。即容器是std::vector<float>,以下行仍然与C2397错误。
obj mm({ 42.0f }, 1);
我不倾向于相信自己没有遇到很多编译器错误(尽管它们显然存在),但是我不禁认为这可能是一个,或者如果不是,标准中是否有任何提及如何处理这种情况。理想情况下,当容器中存在多个项目时,我希望能够在不显式声明容器类型的情况下使用数组初始值设定项。这可能吗?
【问题讨论】:
-
g++ 9.2 说:
error: narrowing conversion of '4.2e+1' from 'double' to 'unsigned int' [-Wnarrowing]和error: narrowing conversion of '4.2e+1f' from 'float' to 'unsigned int' [-Wnarrowing]在浮动情况下。 -
@Scheff 谢谢,是的,这是一个修复。
标签: c++ visual-studio-2017 array-initialization