在c ++ 98中,以下程序应该调用复制构造函数。
#include <iostream>
using namespace std;
class A
{
public:
A() { cout << "default" ; }
A(int i) { cout << "int" ; }
A(const A& a) { cout << "copy"; }
};
int main ()
{
A a1;
A a2(0);
A a3 = 0;
return 0;
}
如果在上面的情况下声明复制构造函数是显式的(编译器错误输出),那么这很明显。但是我没有看到复制构造函数的输出,因为它没有被声明为显式。我猜这是因为复制省略。有没有办法禁用复制省略或标准规定吗?
答案 0 :(得分:3)
前C++ 17
A a3 = 0;
除非复制被删除,否则将call复制构造函数。通过-fno-elide-constructors
标志
来自C++17
,保证复制省略。所以你将not see复制构造函数被调用。
答案 1 :(得分:1)
你错误地理解了复制省略是什么。有关详细信息,请参阅this question。
在这种特殊情况下,如果您将构造函数显式定义,则会导致错误,因为此行上的A a3 = 0;
编译器使用0创建了一个对象。