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)tipodecltype(auto),Tserá el marcador de posición solo. El tipo deducido paraTse determina como se describe en [dcl.type.simple], como siehubiera sido el operando deldecltype.
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
ees 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?