Каков тип разыменованного указателя или итератора? - PullRequest
0 голосов
/ 06 ноября 2018

Если у меня есть что-то вроде этого:

int a = 5;
auto* p = &a;
decltype(*p) b = 1;

Я бы предположил, что decltype(*p) это int, а не int& или const int&.

Но тогда как насчет разыменования итератора, например,

std::vector<int> a { 5 };
auto it = a.begin();
decltype(*it) b = 1;

Является ли decltype(*it) int? Но разве это не тип *it int&?

Я подозреваю, что ответ содержится в пункте (4) здесь , но я все еще не понимаю, что такое xvalue и prvalue .

Редактировать : В исходном коде, который меня смутил, должно быть, что-то эквивалентное

const int a = 5;
auto* p = &a;
decltype(*p) b = 1;

и не понял, что a - это const, поэтому decltype(*p) было const int&, и поэтому третья строка была в порядке.

1 Ответ

0 голосов
/ 06 ноября 2018

И *p, и *it дают вам int&, что является ссылкой lvaue на int. Так как у вас есть lvalue decltype(lvalue) дает вам T&.

Это означает, что в обоих кодовых блоках b является int&, и код не будет компилироваться, поскольку вы не можете связать значение prvalue (в данном случае 1) с неконстантной ссылкой lvalue

...