我正在尝试理解转换构造函数。我正在使用以下代码
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行(转换Cont),然后调用第C行(复制构造函数),但是它只称为B行,尽管cls e = 15等同于cls e = cls(15)。因此,我尝试了cls e = cls(15),它也只给出B行。如果有人能解释我们使用以下内容时会发生什么,我会很感激。
cls e = cls(15) //I期待的是一个转换构造函数,然后是复制构造函数,但显然我错了。如能对正在发生的事情作出任何解释,将不胜感激。
发布于 2013-08-25 13:57:22
这是由于复制省略编译器的优化。在某些情况下,编译器可以删除复制构造函数调用。您所看到的是这种优化的实际效果。您正确地假定调用:
但是在这种情况下,第二个调用由构造函数使用返回值优化来选择/删除/优化。编译器直接将对象构造到e中,而不是创建临时对象,然后将其复制到e中。
如果您使用GCC,您可以使用-fno-elide-constructors选项禁用复制-省略,您应该看到您期望的结果。
发布于 2013-08-25 13:58:01
编译器似乎在优化您的代码,而不是调用称为copy elision的复制构造函数。
有关更多细节,请访问这里。
基本上,在复制选择中,编译器优化了您的代码,以省略不必要的中间临时对象。
发布于 2013-08-25 13:59:48
你说得对,cls e = 15和cls e = cls(15)是一样的。这是因为您的cls(int a)没有被声明为显式。接下来是编译器复制省略优化。
https://stackoverflow.com/questions/18429707
复制相似问题