Значение скобок в decltype ((c))?

я читал эта статья в Википедии о 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) представлять именующий?

32

Решение

  • c имя переменной;

  • (c) является выражением, в данном случае именующий выражение, значение которого совпадает со значением переменной c,

И оба рассматриваются по-разному decltype, Рассмотрим, например, decltype(1+2), который также является примером того, выражение. Просто так получилось, что ваш пример просто версия выражения: такая, которая просто называет одну переменную и ничего с ней не делает.

Это одно из тех отличий, о которых вы, как правило, заботитесь только о том, как рационализировать тонкие части языковой спецификации; хотя, как вы определили, в данном случае это имеет довольно существенный практический эффект.

Пожалуйста, обратите внимание, что нет оператор Использование здесь. Это все просто вывод из схемы грамматики.

19

Другие решения

Я нашел хорошее описание Вот. Он описывает разницу между:

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]

7

По вопросам рекламы [email protected]