Это зависит от сигнатур открытых конструкторов Bar
, явно или неявно определенных.
Начнем с того, что стандарт C ++ допускает неявное преобразование ссылок при условии единственного различия вОсновным типом является то, что тип назначения имеет, по крайней мере, квалифицированное по cv , чем тип источника, используя частичное упорядочение, определенное в этой таблице (C ++ 11, §3.9.3 / 4):
без квалификатора cv <<code>const
без квалификатора cv <<code>volatile
без квалификатора cv <<code>const volatile
const
<<code>const volatile
volatile
<<code>const volatile
Итак, учитывая это, а также §12.8 / 2:
Не шаблонный конструктор для класса X
является конструктором копирования, если его первый параметр имеет тип X&
, const X&
, volatile X&
или const volatile X&
, и другие параметры отсутствуют.или же все остальные параметры имеют аргументы по умолчанию.
, если Bar имеет конструктор с любым следующегоg подписей:
Bar(Bar&);
Bar(Bar const&);
Bar(Bar volatile&);
Bar(Bar const volatile&);
, тогда да, b
будет скопировано в Foo::bar
.
РЕДАКТИРОВАТЬ: Это былонеправильно, я думал о operator=
и подробностях квалификации в качестве оператора назначения перемещения.
Обратите внимание, что возможно иметь подходящий конструктор, который не является конструктором копирования:
Bar(Bar);
Это будет работать (читай: компилировать), но технически это не конструктор копирования.