Есть ли способ отключить копирование elision в c ++ компиляторе - PullRequest
0 голосов
/ 13 июня 2018

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

Это очевидно, если вы объявите конструктор копирования явным образом в вышеприведенном случае (ошибки компилятора отсутствуют).Но я не вижу выходных данных конструктора копирования, когда он не объявлен как явный.Я предполагаю, что это из-за копирования.Есть ли способ отключить копирование elision или стандарт требует это?

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Предварительно C++ 17

A a3 = 0;

вызовет вызовет конструктор копирования, если копия не исключена.Передайте -fno-elide-constructors flag

из C++17, разрешение на копирование гарантировано.Таким образом, вы не увидите, будет скопирован конструктор копирования.

0 голосов
/ 13 июня 2018

Вы неправильно понимаете, что такое копия.Пожалуйста, обратитесь к этому вопросу для получения дополнительной информации.

В этом конкретном случае, если вы определите конструктор явным образом, это вызовет ошибку, потому что A a3 = 0; в этой строке компилятор создал объектиспользуя 0.

...