tag long length google example c++ language-lawyer c++17 structured-bindings

c++ - long - ¿Se supone que decltype(auto) para un enlace estructurado es una referencia?



title tag (1)

Los identificadores mismos son referencias. Desde [dcl.struct.bind]/3 :

Dado el tipo T i designado por std​::​tuple_element<i, E>​::​type , cada v i es una variable de tipo "referencia a T i " inicializada con el inicializador, donde la referencia es una referencia de lvalue si el inicializador es un lvalue y una referencia de rvalue de lo contrario; el tipo referenciado es T i .

Es decir, b son int&& .

Pero la forma en que decltype(auto) comporta realmente proviene de [dcl.type.auto.deduct] :

Si el marcador de posición es el decltype(auto) tipo decltype(auto) , T será el marcador de posición solo. El tipo deducido para T se determina como se describe en [dcl.type.simple], como si e hubiera sido el operando del decltype .

Esta redacción es realmente incómoda, pero en última instancia:

decltype(auto) e = a; ~~~~~~~~~~~~~~

medio:

decltype( a ) e = a; ~~~~

y decltype(a) significa, desde [dcl.type.simple]/4.1 :

si e es una expresión-id sin paréntesis que nombra un enlace estructurado ([dcl.struct.bind]), decltype(e) es el tipo referenciado como se indica en la especificación de la declaración de enlace estructurado;

El tipo referenciado de a es int , por lo que e debe ser un int . Lo que significa que no es una referencia, y el ruido es correcto. Archivado 81176 .

Considere un ejemplo:

#include <iostream> #include <type_traits> #include <tuple> int main() { auto tup = std::make_tuple(1, 2); auto [ a, b ] = tup; decltype(auto) e = a; std::cout << std::boolalpha << std::is_reference_v<decltype(e)> << std::endl; }

clang (output: false ) y clang (output: true ) no están de acuerdo en este caso simple. Teniendo en cuenta, por ejemplo, estas preguntas y respuestas, ¿ debería ser e una referencia o es un error de gcc? O tal vez el código está mal formado?