Пример из P0641 , откуда эта формулировка:
struct MyType {
MyType(MyType&); // no 'const'
};
template <typename T>
struct Wrapper {
Wrapper(const Wrapper&) = default;
T t;
};
Wrapper<MyType> var; // fails to instantiate
Притворяться, что на самом деле был конструктор по умолчанию.
Это было ранее неправильно сформировано. Теперь T<sub>1</sub>
(конструктор копирования Wrapper
) отличается от того, чем он был бы, если бы он был неявно объявлен (было бы Wrapper(Wrapper&)
per [class.copy.ctor] / 7 ) , Это не соответствует случаям в первом наборе пуль (здесь T<sub>1</sub>
имеет const&
, но не T<sub>2</sub>
, пуля в обратном порядке), поэтому мы переходим ко второму набору пуль - и мы в итоге удаляется конструктор копирования Wrapper<MyType>
.
Хорошим примером того, как это могло бы появиться в коде, является что-то вроде std::tuple
(см. LWG2086 ), где до этих изменений:
struct A {
A();
A(A&);
};
std::tuple<A> x; // ill-formed
Теперь, это правильно, просто что tuple<A>
не копируется.