Создание экземпляров в мире гарантированного копирования - PullRequest
0 голосов
/ 26 июня 2018

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

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

1 Ответ

0 голосов
/ 26 июня 2018

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

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

Это из-за [temp.inst] / 2

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...