c++ - sirve - signos de puntuacion
Significado de los paréntesis en decltype((c))? (2)
Estaba leyendo este artículo en Wikipedia sobre la característica de inferencia de tipos de C++11
.
Hay un ejemplo y cito:
#include <vector>
int main() {
const std::vector<int> v(1);
auto a = v[0]; // a has type int
decltype(v[1]) b = 1; // b has type const int&, the return type of
// std::vector<int>::operator[](size_type) const
auto c = 0; // c has type int
auto d = c; // d has type int
decltype(c) e; // e has type int, the type of the entity named by c
decltype((c)) f = c; // f has type int&, because (c) is an lvalue
decltype(0) g; // g has type int, because 0 is an rvalue
}
En las siguientes líneas:
decltype(c) e; // e has type int, the type of the entity named by c
decltype((c)) f = c; // f has type int&, because (c) is an lvalue
¿Cuál es la diferencia entre c
y (c)
? ¿Por qué (c)
representa un lvalor ?
He encontrado una buena descripción here . Describe la diferencia entre:
struct A { double x; };
const A* a = new A();
...
decltype(a->x) x4; // type is double
decltype((a->x)) x5; // type is const double&
y cito:
El motivo de la diferencia entre las dos últimas invocaciones de decltype es que la expresión entre paréntesis
(a->x)
no es una expresión id ni una expresión de acceso miembro, y por lo tanto no denota un objeto nombrado. [ 13 ]Debido a que la expresión es un valor l, su tipo deducido es "referencia al tipo de la expresión", o
const double&
. [ 10 ]
c
es el nombre de una variable;(c)
es una expresión, en este caso una expresión de valor l , cuyo valor es idéntico al valor de la variablec
.
Y los dos son tratados de manera diferente por decltype
. Considere, por ejemplo, decltype(1+2)
, que también es un ejemplo que toma una expresión . Da la casualidad de que su ejemplo es una versión simple de una expresión: una que simplemente nombra una sola variable y no hace nada emocionante con ella.
Es una de esas diferencias que generalmente solo le interesan si está racionalizando las partes sutiles de la especificación del lenguaje; sin embargo, como usted ha identificado, tiene un efecto práctico bastante significativo en este caso.
Tenga en cuenta que no hay uso del operador aquí. Todo es simplemente una deducción del diseño de la gramática.