Являются ли необъявленные конструкторы копирования автоматически встроенными?

Необъявленные (автоматически сгенерированные) конструкторы копирования автоматически помечаются как inline?

Если так, и если я не хочу, чтобы они были помечены как inline, означает ли это, что я должен определить один вручную и скопировать каждый отдельный элемент, который мне нужен вручную (при условии, что я не использую C++11, так что нет = default чтобы воспользоваться)?

4 ответа

Решение

С ними обращаются, как если бы они были объявлены inline (что не обязательно означает, что они будут встроены). И да, в пре-C++11 единственный способ предотвратить их встроенное состояло в том, чтобы объявить и определить их вручную, явно копируя каждый член и каждый базовый класс в списке инициализатора.

Да. Из C++11, 12,8/11:

Неявно объявленный конструктор копирования / перемещения является inline public член своего класса.

Я настоятельно рекомендую прочитать все 12.8, если вы хотите поближе познакомиться с конструкторами копирования и перемещения.

Они, я верю. Однако для такой функции, определенной компилятором, разница между inline и не ненаблюдаем. И да, вы должны определить свой собственный, чтобы он неinlineХотя, почему вы хотите, чтобы такая вещь была за мной. Это не имеет никакого значения для семантики и не повлияет на встраивание компилятора.

Неявно определенные специальные функции-члены inline и они должны быть такими, какими они могут быть неявно сгенерированы в нескольких единицах перевода. Значение inline заключается в том, что он может быть определен в нескольких единицах трансляции без нарушения ODR, а не в том, что код фактически будет встроенным (это зависит от типа и компилятора).

Почему вы не хотите, чтобы конструктор копирования был inline?

Другие вопросы по тегам