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

san*_*pta 4 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;
}
Run Code Online (Sandbox Code Playgroud)

如果您在上述情况下显式声明复制构造函数(编译器出错),这很明显。但是当它未声明为显式时,我看不到复制构造函数的输出。我想这是因为复制省略。有什么方法可以禁用复制省略或标准是否强制要求?

Gau*_*gal 5

C++ 17

A a3 = 0;
Run Code Online (Sandbox Code Playgroud)

除非复制被省略,否则将调用复制构造函数。通过-fno-elide-constructors标志

from C++17,保证复制省略。所以你不会看到复制构造函数被调用。