Подтвердить что ты не робот

Могут ли параметры типа non-type в С++ 17 быть decltype (auto)?

Я обнаружил, что gcc и clang позволяют использовать decltype(auto) в предложении типа параметра типа non-type. Например:.

template <decltype(auto)>
struct X {};

int foo ;

int main() {
    X<(foo)> x;
    static_cast<void>(x);
}

[live demo gcc] [live demo clang]

Является ли это стандартной совместимой функцией или это расширение gnu?

4b9b3361

Ответ 1

Это стандарт. Во-первых, для параметра непигового шаблона:

[temp.param/4]

Параметр шаблона, не относящийся к типу, должен иметь одно из следующих (необязательно cv-qualified):

  • ...
  • тип, содержащий тип заполнителя.

Если типы заполнителей имеют следующие значения:

[dcl.spec.auto/1]

Атрибуты auto и decltype (auto) используются для обозначения тип-заполнителя, который будет заменен позже путем вычитания из инициализатор. Автоматический тип-спецификатор также используется для введения тип функции, имеющий тип возвращаемого типа возврата или означающий, что лямбда - это общая лямбда ([expr.prim.lambda.closure]). Авто Тип-спецификатор также используется для введения структурированного связывания декларация.

[dcl.spec.auto/5]

Тип-заполнитель также можно использовать в типе-спецификаторе-seq в new-type-id или идентификатор типа нового выражения и как спецификатор decl декларация параметра decl-specifier-seq в шаблон-параметров.

Так как пуля выше говорит "тип заполнителя", и такой тип может быть обозначен либо с помощью auto, либо decltype(auto), оба компилятора верны.