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

Is there a way to disable copy elision in c++ compiler

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

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

你对copy elision的理解有误。详情请参考this question

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

C++ 17

A a3 = 0;

call 复制构造函数,除非复制被省略。传递-fno-elide-constructors标志

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