Форум программистов, компьютерный форум CyberForum.ru

Value categories. Является ли выражение xvalue? - C++

Восстановить пароль Регистрация
 
Vlad1slav
21 / 21 / 5
Регистрация: 16.09.2009
Сообщений: 111
29.07.2015, 23:13     Value categories. Является ли выражение xvalue? #1
Знакомлюсь с xvalue. Прочитал описание на cppreference.
Согласно описанию,
a non-static class member access expression, in which the object expression is an xvalue
выражение доступа к нестатическому члену класса является xvalue, если сам объект является xvalue.
xvalue объект проще всего получить через std::move.
Определение категорий выражений стырено со stackoverflow.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// prvalue
template<typename T>
struct ValueCategory
  {
  static const char* const value;// = "prvalue";
  };
template<typename T>
const char* const ValueCategory<T>::value = "prvalue";
 
// lvalue
template<typename T>
struct ValueCategory<T&>
  {
  static const char* const value;// = "lvalue";
  };
template<typename T>
const char* const ValueCategory<T&>::value = "lvalue";
 
// xvalue
template<typename T>
struct ValueCategory<T&&>
  {
  static const char* const value;// = "xvalue";
  };
template<typename T>
const char* const ValueCategory<T&&>::value = "xvalue";

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define DetermineValueCategory(text, expr) \
  std::cout << ValueCategory<decltype((expr))>::value << " : " << text << std::endl;
 
int main()
{
    struct TestXClass
    {
    TestXClass(int i_value) : m_value(i_value) {}
    int m_value;
    };
  DetermineValueCategory("std::move", std::move(TestXClass(10)));
  DetermineValueCategory(
    "a non-static class member access expression, in which the object expression is an xvalue", 
    std::move(TestXClass(10)).m_value
  );
}
Этот код утверждает что в первом случае получается xvalue expression(что собственно логично),
а во втором случае - prvalue, что не соответствует описанию на cppreference.
Это я неправильно перевёл/понял выражение на cppreference, или проблема в чём-то другом?

Добавлено через 44 минуты
Оказывается VS2013 работает не корректно с xvalue, а в gcc всё работает как положено.
gcc - http://rextester.com/FIQ51611
vc++ - http://rextester.com/EMVE94367
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2015, 23:13     Value categories. Является ли выражение xvalue?
Посмотрите здесь:

Является ли данная строка действительным IP-адресом C++
C++ Проверить является ли выражение состоящее только из ПРОПИСНЫХ букв палиндромом
Подставить в заданное выражение знаки +,-,*,/ так, чтобы выражение было истинным C++
C++ Вывести значение логического выражения, заданного в виде строки S. Выражение определяется следующим образом («T» — True, «F» — False): <выражение> :
C++ Проверить является ли скобочное выражение правильным
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
29.07.2015, 23:38     Value categories. Является ли выражение xvalue? #2
В этом случае лучше сослаться на сам стандарт. 3.10 Lvalues and rvalues
Миниатюры
Value categories. Является ли выражение xvalue?   Value categories. Является ли выражение xvalue?  
Vlad1slav
21 / 21 / 5
Регистрация: 16.09.2009
Сообщений: 111
30.07.2015, 10:21  [ТС]     Value categories. Является ли выражение xvalue? #3
castaway, в этом случае, как раз таки, лучше поискать другое описание(не из стандарта), т.к. описание в стандарте очень расплывчатое и предоставляет всего лишь 1 пример.

1) xvalue также ссылаеся на объект, обычно время жизни которого подходит к концу.
2) Некоторые виды выражений являющиеся rvalue-ссылкой являются (выступают в роли) xvalue.
3) Пример: Результат выполнения функции, возвращающей rvalue-ссылку на объект - является xvalue.

Во-первых, меня смущает слово обычно. Если уберём это слово, то получиться некорректное выражение.
C++
1
2
3
std::unique_ptr<int> p(new int);
std::unique_ptr<int> p2(std::move(p));
//smg else
Согласно стандарту, время жизни объекта p после выхода из функции move должно закончиться?
Т.к. время жизни объекта завершается когда вызывается деструктор, то скоро будет вызван деструктор p?
Однако же я знаю что деструктор будет вызван при выходе из области видимости, а этом может быть очень нескоро.

Во-вторых, 'некоторые виды выражений...' - это ещё лучше чем фраза 'обычно'. Где тут однозначность? некоторые, но я не скажу какие.

В-третьих, дан пример одного из использований, который является наиоблее очевидным.

Я это всё к тому, что стандарт не даёт ответа на мой вопрос, а именно:
верно ли утверждение: "a non-static class member access expression, in which the object expression is an xvalue"?.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.07.2015, 11:34     Value categories. Является ли выражение xvalue? #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Vlad1slav, http://stackoverflow.com/questions/1...create-xvalues
Вкратце - да, верно.

Добавлено через 16 минут
К слову, на тему стандарта:
5/7
Note: An expression is an xvalue if it is:
(7.1) — the result of calling a function, whether implicitly or explicitly, whose return type is an rvalue reference
to object type,
(7.2) — a cast to an rvalue reference to object type,
(7.3) — a class member access expression designating a non-static data member of non-reference type in which
the object expression is an xvalue, or
(7.4) — a .* pointer-to-member expression in which the first operand is an xvalue and the second operand is
a pointer to data member.
In general, the effect of this rule is that named rvalue references are treated as lvalues and unnamed rvalue
references to objects are treated as xvalues; rvalue references to functions are treated as lvalues whether
named or not. — end note ]
C++
1
2
3
4
5
6
7
struct A {
int m;
};
A&& operator+(A, A);
A&& f();
A a;
A&& ar = static_cast<A&&>(a);
The expressions f(), f().m, static_cast<A&&>(a), and a + a are xvalues. The expression ar is an lvalue.
Так что все там описано как видно.
Yandex
Объявления
30.07.2015, 11:34     Value categories. Является ли выражение xvalue?
Ответ Создать тему
Опции темы

Текущее время: 17:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru