Является ли это выражение значением xvalue?

Стандарт C ++ говорит о «значениях x» следующее (N4762 § 7.2.1.4):

Выражение является значением xvalue, если оно:
— . . .
— выражение доступа к члену класса, обозначающее нестатический член данных не ссылочного типа, в котором выражение объекта является значением xvalue

Рассмотрим следующий фрагмент кода (используя Boost для печати типа выражения):

#include <iostream>
#include <boost/type_index.hpp>

using boost::typeindex::type_id_with_cvr;

struct X {
int var;
} x;

int main()
{
auto extended_type = type_id_with_cvr<decltype( std::move(x).var )>();
std::cout << extended_type.pretty_name() << std::endl;
}

Мой вопрос о выражении std::move(x).var:

Исходя из текста в стандарте, я ожидаю, что выражение будет xvalue, но вывод intне int &&,

Что мне здесь не хватает?

6

Решение

Мой вопрос о выражении: std::move(x).var

Исходя из текста в стандарте, я ожидаю, что выражение будет xvalue,

Это.

но выход intне int &&

Это потому что decltype приходит в двух формах. Он может дать информацию о том, как объявлено имя, или он может предоставить информацию о типе и категории выражения.

поскольку std::move(x).var Это членский доступ, вы получаете первый. Чтобы получить последнее, используйте decltype((std::move(x).var)) (с двойными скобками).

11

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

Других решений пока нет …

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