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

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

Выражение является значением x, если оно:
- . . .
— выражение доступа к члену класса, обозначающее нестатический член данных нессылочного типа, в котором выражение объекта является значением 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:

Основываясь на тексте в стандарте, я ожидаю, что выражение будет значением x, но вывод будет int, а не int &&.

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


person Tootsie    schedule 26.08.2018    source источник


Ответы (1)


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

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

It is.

но вывод int, а не int &&

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

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

person Community    schedule 26.08.2018
comment
Спасибо, это имеет смысл. Рад, что не ошибся с типом выражения - person Tootsie; 27.08.2018
comment
Итак, это реальный вариант использования decltype с двойными скобками! - person Dean Seo; 27.08.2018