我遇到了一个问题,在使用VS2017(C++14,C++17和最新的ISO)时,我无法在数组初始化器中使用特定的构造函数。
当应该使用填充有单个元素的容器调用构造函数时,我会收到一个C2397 将“double”转换为“unsigned int”需要缩小转换
错误提示。
#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);
个人认为编译器错误并不常见(尽管它们显然存在),但我不能不认为这可能是一个编译器错误。如果不是,那么标准中有没有提到如何处理这种情况?理想情况下,当容器中存在多个项时,我希望能够在不明确声明容器类型的情况下使用数组初始化程序。这可以实现吗?