我正在尝试了解转换构造函数。我正在使用以下代码
class cls
{
public:
cls()
{
std::cout << "Regular constructor \n"; ---> Line A
}
cls (int a) //Constructing converter
{
std::cout << "Int constructor \n"; ---> Line B
}
cls (cls& d) //Copy constructor
{
std::cout << "Copy constructor \n"; ---> Line C
}
};
int main()
{
cls d;
std::cout << "-----------------------\n";
cls e = 15; //int constructor then copy constructor
return;
}
现在我对语句cls e = 15
感到困惑,我的理解是这个语句假设调用行B(转换连续)然后调用行C(复制构造函数),但它只调用行B.我虽然{{ 1}}相当于cls e = 15
。所以我尝试了cls e = cls(15)
,它也只提供了B行。如果有人能解释当我们使用以下内容时会发生什么,我将不胜感激
cls e = cls(15)
//我期待一个转换构造函数,后跟复制构造函数,但显然我错了。任何有关正在发生的事情的解释都将受到赞赏
答案 0 :(得分:3)
这是由 copy elision 编译器优化引起的。在某些情况下,允许编译器忽略复制构造函数调用。你看到的是这种优化的实际效果。你正确地打电话给:
但是在这种情况下,构造函数通过使用返回值优化来省略/删除/优化第二个调用。编译器直接将对象构造到e
,而不是创建临时对象,然后将其复制到e
。
如果您使用GCC,可以使用-fno-elide-constructors
选项禁用复制省略,您应该会看到预期的结果。
答案 1 :(得分:0)
答案 2 :(得分:0)
你是对的cls e = 15
与cls e = cls(15)
相同。这是因为您的cls(int a)
未声明。接下来只是编译器复制省略优化。