gpt4 book ai didi

c++ - 如何在 C++ 中使用列表初始化程序解决大括号省略的歧义?

转载 作者:行者123 更新时间:2023-12-03 18:54:03 32 4
gpt4 key购买 nike

我想为 3x3 矩阵制作我自己的结构。我想允许通过组件/元素或“行”进行构建。
所以要么你提供一个 std::array<float, 9>std::array<std::array<float, 3>, 3>但是,当使用以下构造函数定义这样的结构时:

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

Matrix3x3(std::array<std::array<float, 3>, 3> rows) { }
};
然后第二个构造函数与第一个构造函数有歧义。这意味着您可以像这样调用第二个构造函数 Matrix3x3{ {{ {{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}} };将给出以下消息和错误:
message : No constructor could take the source type, or constructor overload resolution was ambiguous
error C2440: '<function-style-cast>': cannot convert from 'initializer list' to 'ArrayTest'
Visual Studio 告诉我“有不止一个构造函数实例......匹配参数列表”。
我测试了做同样的事情,但使用了一个整数数组(因为它更容易使用)和一个长度。考虑:
struct ArrayTest
{
ArrayTest(std::array<int, 1> arrayOfInts) { }

ArrayTest(std::array<std::array<int, 1>, 1> 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::array<float, 9> components{ 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f };

std::array<float, 3> row1{ 1.f, 2.f, 3.f };
std::array<float, 3> row2{ 4.f, 5.f, 6.f };
std::array<float, 3> row3{ 7.f, 8.f, 9.f };

Matrix3x3 m1{ components };
Matrix3x3 m2{ { row1, row2, row3} };
这避免了使用列表初始值设定项进行大括号省略的歧义,但是这相当乏味并且似乎不是“最佳”,因为从那时起您正在构建临时数组,只是为了构建其他东西,而列表初始化的点在此情况是避免这些。

关于c++ - 如何在 C++ 中使用列表初始化程序解决大括号省略的歧义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66295705/

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