Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何解决C+中使用列表初始值设定项的大括号省略的歧义+;?_C++_Overload Resolution_List Initialization_Brace Elision - Fatal编程技术网

C++ 如何解决C+中使用列表初始值设定项的大括号省略的歧义+;?

C++ 如何解决C+中使用列表初始值设定项的大括号省略的歧义+;?,c++,overload-resolution,list-initialization,brace-elision,C++,Overload Resolution,List Initialization,Brace Elision,我想为3x3矩阵创建自己的结构。我希望允许通过组件/元素或“行”进行构造 因此,要么提供一个std::array要么提供一个std::array 但是,当使用以下构造函数定义这样的结构时: 结构矩阵x3x3 { 矩阵x3x3(std::数组组件){} 矩阵x3x3(std::数组行){} }; 然后,第二个构造函数与第一个构造函数不明确。这意味着您可以像这样调用第二个构造函数 矩阵x3x3{{{{{{{{1.f,2.f,3.f},{{{4.f,5.f,6.f},{{{7.f,8.f,9.f}

我想为3x3矩阵创建自己的结构。我希望允许通过组件/元素或“行”进行构造

因此,要么提供一个
std::array
要么提供一个
std::array

但是,当使用以下构造函数定义这样的结构时:

结构矩阵x3x3 { 矩阵x3x3(std::数组组件){} 矩阵x3x3(std::数组行){} }; 然后,第二个构造函数与第一个构造函数不明确。这意味着您可以像这样调用第二个构造函数

矩阵x3x3{{{{{{{{1.f,2.f,3.f},{{{4.f,5.f,6.f},{{{7.f,8.f,9.f}

没有任何问题,但是像这样调用第一个构造函数

Matrix3x3{{{{1.f,2.f,3.f,4.f,5.f,6.f,7.f,8.f,9.f}

将给出以下消息和错误:

消息:没有构造函数可以采用源类型,或者构造函数重载解析不明确
错误C2440:'':无法从“初始值设定项列表”转换为“ArrayTest”
VisualStudio告诉我“有多个构造函数实例……与参数列表匹配”

我测试了做同样的事情,但是使用了一个int数组(因为它更容易使用)和一个长度。考虑:

struct ArrayTest
{
ArrayTest(std::arrayOfInts){}
ArrayTest(std::arrayOfArraysOfInts数组){}
};
那么前3个是有效的,并为第一个构造函数编译,而所有5个都为第二个构造函数编译

auto test1 = ArrayTest{ {1} };

auto test2 = ArrayTest{ { {1} } };

auto test3 = ArrayTest{ { { {1} } } };

auto test4 = ArrayTest{ { { { {1} } } } };

auto test5 = ArrayTest{ { { { { {1} } } } } };
对于简单数组构造函数,“test3”是完整的初始化,其中第一对括号初始化聚合ArrayTest,第二对括号初始化数组,第三对括号初始化该数组的第一个元素,最后第四个括号初始化整数1,该整数很少见,但有效。“test1”和“test2”只是“test3”的括号省略版本

对于array of arrays构造函数,它类似于“test5”是完整的初始化,而所有其他构造函数都是大括号省略的。这就是造成歧义的原因


所以问题是:我如何解决这个问题?或者有更好的方法/解决方案吗?

解决此问题的一种方法是单独声明和定义临时数组,如下所示:

std::数组组件{1.f、2.f、3.f、4.f、5.f、6.f、7.f、8.f、9.f};
std::数组row1{1.f,2.f,3.f};
std::数组row2{4.f,5.f,6.f};
std::数组row3{7.f,8.f,9.f};
矩阵x3x3 m1{components};
矩阵x3x3 m2{{row1,row2,row3};

这避免了使用列表初始值设定项进行大括号省略的模糊性,但是这相当繁琐,而且似乎不是“最优的”,因为此时您正在构造临时数组,只是为了构造其他内容,而在本例中,列表初始化的目的是避免这些。使用标记:空结构,例如。,
struct by_row{}。然后,您的by row构造函数将其作为第一个参数,而另一个不作为第一个参数。与
中的算法类似)


()(事实上,我更喜欢。)

这能回答你的问题吗@不,不幸的是它没有,或者至少我不明白它会怎样。这个问题不是关于为什么以及什么时候可以在初始化中省略大括号,而是为什么我的两个构造函数是不明确的。@helpfulhelper:这是不明确的,因为两个构造函数都可以在给定大括号集的情况下调用。大括号省略使得在给定大括号集的情况下调用任何一个构造函数成为可能。@NicolBolas我重新考虑并重新定义了我的问题。我理解为什么现在它是不明确的,但我仍然不知道如何优雅地解决这个问题。列表初始化使用列表初始值设定项对象。这并不能避免暂时的。另外,虽然将std::array作为参数传递对于编译器来说应该是微不足道的,但对于传递列表初始值设定项,我并不是很确定。我很确定它的内容需要复制到数组中。
struct by_row {};

struct Matrix3x3
{
    Matrix3x3(std::array<float, 9> components) { ... }

    Matrix3x3(by_row, std::array<std::array<float, 3>, 3> rows) { ... }
};
    Matrix3x3 m{1,0,0,0,1,0,0,0,1};
    Matrix3x3 n{by_row{}, {{{1,0,0},{0,1,0},{0,0,1}}}};