C++委托构造函数中用大括号括起来的初始值设定项列表

C++ brace enclosed initializer list in delegate constructor

本文关键字:列表 构造函数 C++ 起来      更新时间:2023-10-16

我正在尝试为c ++类提供两个不同的构造函数,包括std::vector成员:

class A {
public:
std::vector<int> p;
A (std::vector<int> i) { p = i; }
A (int x, int y, int z) : A ( {x, y, z} ) {}
};
int main () {
A a ( {1, 2, 3} );
A a2 (1, 2, 3);
return 0;
}

第一个构造函数工作正常,但第二个构造函数抛出以下错误:

error: call of overloaded ‘A(<brace-enclosed initializer list>)’ is ambiguous

这两种方法有什么区别?

问题出在第二个构造函数中:

A (int x, int y, int z) : A ( {x, y, z} ) {}

由于A ( {x,y,z} )可以同时调用两者

  • 第一个构造函数:初始化列表{x, y, z}可以强制转换为std::vector<int>并与第一个构造函数匹配。

  • 第二个构造函数本身:正如你在这里看到的构造函数调用自己的位置:


A::A(int, int, int):
pushl   %ebp
movl    %esp, %ebp
subl    $8, %esp
// ...
call    A::A(int, int, int)  // <--- recursive call
// ...

这两种方法有什么区别?

第一个构造函数接受整数的任何向量。有效的结构是,例如:

A({1}); A({1, 2}); A({1, 2, 4}); A({1, 2, 3, 4, ...}); ...

第二个构造函数接受三个整数。有效的结构是:

A({1, 2, 3}); A(1, 2, 3); A{1, 2, 3};

如您所见,表达式A({1, 2, 3})被两个构造函数接受,因此它是模棱两可的(编译器无法以确定性的方式知道哪个选择(。