我有 2 个测试类:
class B {
public:
B(int i) {
qDebug() << "B constructor ";
}
};
class A {
public:
A(B b) {
qDebug() << "A constructor ";
}
};
现在我想用 B 创建 A 对象,这就是我所做的:
int i = 5;
A test (B(i)); //does not work
代码编译没有错误,但第二行根本不执行。我做了一些测试,下面的代码运行良好:
int i = 5;
A test (B((int)i)); //works
A test (B(5)); //works
所以,我想编译器不能在 B 构造函数调用中将"i"解释为 int,但为什么呢?
这个:
A test(B(i));
与以下各项相同:
A test(B i);
这是一个函数声明,而不是由于最令人烦恼的解析而对构造函数的调用。有一条规则规定(S. Meyers,"有效的现代C++"(:
任何可以解析为声明的内容都必须解释为 一
为了避免这种情况,请使用大括号初始化(而不是括号()
(,因为函数不能用大括号声明{}
:
A test{B(i)};
话虽如此,您的示例中没有"嵌套构造函数调用"。