C++委托构造函数中用大括号括起来的初始值设定项列表
C++ brace enclosed initializer list in delegate constructor
我正在尝试为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})
被两个构造函数接受,因此它是模棱两可的(编译器无法以确定性的方式知道哪个选择(。
相关文章:
- 一对向量构造函数:初始值设定项列表与显式构造
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 构造函数/函数声明参数列表中的统一初始化
- 在初始化列表之外手动调用基类的构造函数
- 采用初始值设定项列表的构造函数
- 提供初始值设定项列表构造函数的有效方法
- C 标准中是否有任何计划来解决初始化器列表构造函数的不一致性
- 接受迭代器的初始值设定项列表构造函数
- STD :: MAP初始化列表构造函数
- 如何避免丢失自动生成的初始化列表构造函数
- 如何最小化调用列表构造函数(复制构造函数)的次数?
- 初始化列表构造函数错误带有CRTP
- 启用默认初始值设定项列表构造函数
- 使用初始化列表构造函数时C++奇怪的行为
- 自定义列表类的初始值设定项列表构造函数
- 初始值设定项列表构造函数导致右值构造函数不明确
- 调用初始化列表构造函数的不同方式
- 为什么std::array不包含初始化列表构造函数
- C++ 为类模板提供初始值设定项列表构造函数
- 何时使用初始值设定项列表构造函数