2017-11-11 180 views
0

我有2个测试类:C++嵌套构造函数调用问题

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 

所以,我想编译器不能解释的“i”为INT乙构造函数调用里面,但是为什么呢?

回答

0

此:

A test(B(i)); 

是一样的:

A test(B i); 

这是一个函数声明,而不是一个呼叫由于most vexing parse来构造函数。 有,指出(S.迈尔斯,“有效的现代C++”)的规则:

任何可以被解析为声明必须被解释为 一个

为了避免使用支撑初始化(而不是括号())的功能,不能与{}括号声明:

A test{B(i)}; 

话虽这么说,有没有“嵌套构造CA lls“在你的例子中。

+0

是的,谢谢,这解释了很多.. C++永远不会“惊叹”我 –