Создание экземпляра конструктора в мире гарантированного копирования elision

Рассмотрим пример:

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() является prvalue того же типа, что и возврат g(), там даже не должно быть движения. Что заставляет нас создавать экземпляр плохого конструктора?

1 ответов


конструктор-это немного отвлекающий маневр. То же самое произошло бы, если бы это была любая другая функция-член.

template <typename T>
struct A
{
    void foo(type<T>); // Same error
};

это из-за [temp.ин-т]/2

неявный экземпляр специализации шаблона класса вызывает имплицитный экземпляр деклараций, но не определения, аргументы по умолчанию или спецификаторы noexcept класса функция-член.[ ,..]

декларация экземпляр, так type<T> должно быть хорошо сформировано.