явный конструктор копирования игнорируется, даже если был указан точный аргумент

Конструктор копирования был предоставлен. При его использовании в аргумент передается точно такой же тип. Еще тем не менее кажется, что компилятор (gcc / g ++ 4.8.2) игнорирует существование явного конструктора копирования.
Код генерирует ошибку компиляции. Зачем?
Ошибка:

t.cpp: In function ‘A f(const A&)’:
t.cpp:19:12: error: no matching function for call to ‘A::A(const A&)’
return a;  //compilation error with gcc 4.8.2
^
t.cpp:19:12: note: candidate is:
t.cpp:14:5: note: A::A()
A(){}
^
t.cpp:14:5: note:   candidate expects 0 arguments, 1 provided
t.cpp:21:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^

Я уже прошла
Почему я не могу вызвать ‘явный (строка x)’?
а также
Явный конструктор копирования.
Основываясь на этих ссылках, я попытался создать принудительную копию (чтобы избежать оптимизации, обратитесь к моему закомментированному коду).

#include <iostream>
using namespace std;

class A
{
public:
explicit A(const A& a)   // an explicit copy constructor
//A(const A&)   // an copy constructor, pretty much default one.
//using it solves any compile problem.
{
cout << "\nin the copy constructor" << endl;
}

A(){}
};
//////////////////////////////////
A f(const A &a)
{
return a;  //compilation error with gcc 4.8.2
//return A(a);   // even tried this to avoid optimization. does not work
}
///////////////////////////////////
int main()
{
//A a;
//f(a);
return 0;
}

1

Решение

Конструктор копирования вызывается неявно по возвращении (а также при передаче аргумента по значению).

Этот код вызовет конструктор копирования дважды:

A f(const A &a)
{
return A(a);
}

A(a) означает явный скопировать, а затем есть неявный копия по возвращении.

Если вы хотите запретить неявное копирование, вы также не можете вернуться копированием. Вам придется вернуться по ссылке или указателю (возможно, с newскопирую).


В C ++ 11 и выше, я считаю, что приведенный выше код вместо этого вызовет переехать конструктор (если определены) для возврата (хотя он все равно будет вызывать конструктор копирования для явного вызова), и это должно быть более эффективным.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector