有没有办法在c ++编译器中禁用复制省略

时间:2018-06-13 09:50:57

标签: c++ initialization copy-constructor

在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;
}

如果在上面的情况下声明复制构造函数是显式的(编译器错误输出),那么这很明显。但是我没有看到复制构造函数的输出,因为它没有被声明为显式。我猜这是因为复制省略。有没有办法禁用复制省略或标准规定吗?

2 个答案:

答案 0 :(得分:3)

C++ 17

A a3 = 0;
除非复制被删除,否则

call复制构造函数。通过-fno-elide-constructors标志

来自C++17,保证复制省略。所以你将not see复制构造函数被调用。

答案 1 :(得分:1)

你错误地理解了复制省略是什么。有关详细信息,请参阅this question

在这种特殊情况下,如果您将构造函数显式定义,则会导致错误,因为此行上的A a3 = 0;编译器使用0创建了一个对象。