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)
,T
será el marcador de posición solo. El tipo deducido paraT
se determina como se describe en [dcl.type.simple], como sie
hubiera 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
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?