gpt4 book ai didi

c++ - 构造函数与数组初始值设定项的歧义

转载 作者:行者123 更新时间:2023-12-02 05:04:02 24 4
gpt4 key购买 nike

我有一个问题,在使用 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);

后者显然没有用,而前者有点烦人,因为它是包含单个项目的容器的极端情况(尽管不是世界末日)。我认为这可能仅对 double (没有文字声明)有问题,但是当用文字初始化 float 时,它甚至会发生。即容器是 std::vector<float> ,以下行仍然存在 C2397 错误。

    obj mm({ 42.0f }, 1);

我不太相信编译器错误,我自己没有遇到过很多错误(尽管它们显然存在),但是我忍不住认为这可能是一个,或者如果没有,标准中是否有任何提及如何处理这种情况。理想情况下,我希望能够使用数组初始值设定项,而无需显式声明容器类型,就像容器中存在多个项目时那样。这可能吗?

最佳答案

使用 {{}} 可以解决所有情况

obj mm({{ 42.0 }}, 1); 

obj mm({{ 42.0, 12.0 }}, 1);

尽管在第二种情况下当然没有歧义(使用单大括号正在利用大括号省略)。

这个问题很好地介绍了该主题:Brace elision in std::array initialization

关于c++ - 构造函数与数组初始值设定项的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60055280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com