c++ templates language-lawyer c++17

auto c++



¿Los parámetros de plantilla no tipo en c++ 17 pueden ser decltype(auto)? (1)

Descubrí que gcc y clang permiten usar decltype(auto) en una cláusula de tipo de parámetro de plantilla sin tipo. P.ej:

template <decltype(auto)> struct X {}; int foo ; int main() { X<(foo)> x; static_cast<void>(x); }

[live demo gcc] [demo demo clang]

¿Es característica estándar compatible o es alguna extensión gnu?


Esto es estándar. Primero, para un parámetro de plantilla sin tipo:

[temp.param/4]

Un parámetro de plantilla sin tipo debe tener uno de los siguientes tipos (opcionalmente calificado):

  • ...
  • un tipo que contiene un tipo de marcador de posición .

Donde los tipos de marcador de posición tienen los siguientes especificados:

[dcl.spec.auto/1]

Los especificadores de tipo auto y decltype (automático) se utilizan para designar un tipo de marcador de posición que se reemplazará más adelante por deducción desde un inicializador. El especificador automático de tipo también se usa para introducir un tipo de función que tiene un tipo de retorno final o para indicar que un lambda es un lambda genérico ([expr.prim.lambda.closure]). El especificador automático de tipo también se usa para introducir una declaración de enlace estructurado.

[dcl.spec.auto/1]

Un tipo de marcador de posición también se puede usar en el type-specifier-seq en el new-type-id o type-id de una new-expression y como un decl-specifier de la declaración-parámetro de un decl-specifier-seq en una plantilla- parámetro.

Como la viñeta anterior dice "tipo de marcador de posición", y dicho tipo puede designarse con auto o decltype(auto) , ambos compiladores son correctos.