я читал эта статья в Википедии о C++11
Вывод типа особенность.
Есть пример, и я цитирую:
#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
}
в следующих строках:
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
В чем разница между c
а также (c)
? Почему (c)
представлять именующий?
c
имя переменной;
(c)
является выражением, в данном случае именующий выражение, значение которого совпадает со значением переменной c
,
И оба рассматриваются по-разному decltype
, Рассмотрим, например, decltype(1+2)
, который также является примером того, выражение. Просто так получилось, что ваш пример просто версия выражения: такая, которая просто называет одну переменную и ничего с ней не делает.
Это одно из тех отличий, о которых вы, как правило, заботитесь только о том, как рационализировать тонкие части языковой спецификации; хотя, как вы определили, в данном случае это имеет довольно существенный практический эффект.
Пожалуйста, обратите внимание, что нет оператор Использование здесь. Это все просто вывод из схемы грамматики.
Я нашел хорошее описание Вот. Он описывает разницу между:
struct A { double x; };
const A* a = new A();
...
decltype(a->x) x4; // type is double
decltype((a->x)) x5; // type is const double&
и я цитирую:
Причиной различия между двумя последними вызовами decltype является то, что выражение в скобках
(a->x)
не является ни выражением id, ни выражением доступа к члену, и, следовательно, не обозначает именованный объект. [13]Поскольку выражение является lvalue, его выведенный тип является «ссылкой на тип выражения», или
const double&
, [10]