初始值设定项列表构造函数导致右值构造函数不明确

initializer-list constructor causing ambiguity with rvalue constructor

本文关键字:构造函数 不明确 列表      更新时间:2023-10-16

我在Visual Studio C++11中尝试使用初始值设定项列表时遇到错误,如下代码所示

template <typename T>
struct TestArray
{
  TestArray(std::initializer_list<T> list) {}
  TestArray(TestArray<T> &&rval) {} // This causes an error
};
struct TestPair
{
  TestPair(int a, int b) {}
};

当我申报时:

TestArray<TestPair> blah({ { 1, 2 } });

我得到错误:

Cannot convert from 'initializer-list' to 'TestArray<TestPair>'
No constructor could take the source type, or constructor overload     resolution was ambiguous

如果我删除右值构造函数,它就可以正常工作。为什么这里的初始值设定项列表和右值构造函数之间存在某种歧义?

您的测试是错误的,您不应该有外部(),更像:

TestArray<TestPair> blah{{1, 2}};