Являются ли необъявленные конструкторы копирования автоматически встроенными?
Необъявленные (автоматически сгенерированные) конструкторы копирования автоматически помечаются как inline
?
Если так, и если я не хочу, чтобы они были помечены как inline
, означает ли это, что я должен определить один вручную и скопировать каждый отдельный элемент, который мне нужен вручную (при условии, что я не использую C++11, так что нет = default
чтобы воспользоваться)?
4 ответа
С ними обращаются, как если бы они были объявлены inline
(что не обязательно означает, что они будут встроены). И да, в пре-C++11 единственный способ предотвратить их встроенное состояло в том, чтобы объявить и определить их вручную, явно копируя каждый член и каждый базовый класс в списке инициализатора.
Да. Из C++11, 12,8/11:
Неявно объявленный конструктор копирования / перемещения является
inline public
член своего класса.
Я настоятельно рекомендую прочитать все 12.8, если вы хотите поближе познакомиться с конструкторами копирования и перемещения.
Они, я верю. Однако для такой функции, определенной компилятором, разница между inline
и не ненаблюдаем. И да, вы должны определить свой собственный, чтобы он неinline
Хотя, почему вы хотите, чтобы такая вещь была за мной. Это не имеет никакого значения для семантики и не повлияет на встраивание компилятора.
Неявно определенные специальные функции-члены inline
и они должны быть такими, какими они могут быть неявно сгенерированы в нескольких единицах перевода. Значение inline
заключается в том, что он может быть определен в нескольких единицах трансляции без нарушения ODR, а не в том, что код фактически будет встроенным (это зависит от типа и компилятора).
Почему вы не хотите, чтобы конструктор копирования был inline
?