Рассмотрим этот пример:
template <typename T>
using type = typename T::type;
template <typename T>
struct A
{
A(type<T>);
};
A<int> f();
A<int> g() { return f(); }
Ни gcc, ни clang не компилируют этот код из-за того, что int
не имеет вложенной type
typedef. Но почему этот конструктор вообще создается? f()
- это значение того же типа, что и возвращаемое g()
, там даже не должно быть никакого движения. Что заставляет нас создавать экземпляр плохого конструктора?