неполное использование класса с авто в классе шаблона - PullRequest
0 голосов
/ 11 октября 2018

Правильно ли сформирован следующий код?

class B;

template<class T>
class A
{
    B do_f() const;
    friend auto f(A const& a) {return a.do_f();} // #1
};

class B{};

template <class T>
B A<T>::do_f() const { return B{};}

int main()
{
    A<double> a;
    f(a);
}

Если изменить auto в # 1 на B, я получу сообщение об ошибке неполного типа.

Скомпилировать с auto для gcc / clang Демо

Сбой с B Демо

1 Ответ

0 голосов
/ 11 октября 2018

[dcl.fct.def.general] / 2 :

Тип параметра или тип возвращаемого значения для определения функции не должен бытьнеполный или абстрактный (возможно, cv-квалифицированный) тип класса в контексте определения функции, если только функция не удалена ([dcl.fct.def.delete]).

Но [dcl.spec.auto] / 10 :

Вывод типа возврата для шаблона функции с заполнителем в объявленном типе происходит, когда создается определение, даже если тело функции содержитreturn оператор с не зависящим от типа операндом.

Итак, с B оно плохо сформировано первым правилом.Но с auto вычитание не происходит до тех пор, пока не будет создан экземпляр функции ... к этому моменту тип завершен, так что все в порядке.

Обратите внимание, что первое правило применяется только к определению, котороеВот почему do_f() хорошо.Вы можете иметь объявления, которые возвращают неполные типы.

Приведенная выше формулировка технически не применима к этому делу.У нас нет шаблона функции.Но цель состоит в том, чтобы применить это к любому виду шаблонов.Существует PR , чтобы редактировать это из:

Вывод типа возврата для шаблона функции с заполнителем [...]

Кому:

Возвращение типа вычета для шаблонного объекта, который является функцией или шаблоном функции с заполнителем в его

, которыйздесь применимо.

...