Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Vlad1slav
21 / 21 / 5
Регистрация: 16.09.2009
Сообщений: 111
#1

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

29.07.2015, 23:13. Просмотров 649. Ответов 4
Метки нет (Все метки)

Знакомлюсь с 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
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2015, 23:13
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Value categories. Является ли выражение xvalue? (C++):

Xvalue и prvalue - C++
А в чем, собственно, разница? И вообще, есть какая-то разница между следующими функциями: int&amp;&amp; func(); int func(); ...

Проверить является ли скобочное выражение правильным - C++
Является ли выражения вида ()()()()()())))()( правильным, на вход подается символы '(' и ')' в любой последовательности.

Проверить является ли выражение состоящее только из ПРОПИСНЫХ букв палиндромом - C++
Проверить является ли выражение состоящее только из ПРОПИСНЫХ букв палиндромом. Если да то напечатать полученный, иначе вывести строку с...

Записать логическое выражение, которое является истинным тогда, когда выполняются условия при заданных числах - C++
Здравствуйте! Помогите пожалуйста написать программу С++. Записать логическое выражение, которое является истинным тогда, когда...

Restrict Categories - WordPress
Подскажите, как можно ограничить доступ: Гости могут видеть только анонс рубрики. Для просмотра полного поста/страницы надо быть как...

Является ли выражение простым - Алгебра
Доброго времени суток. Может я темой ошибся, поправьте меня тогда. Надо проверить, является ли выражение целым для любого n, k. ...

4
castaway
Эксперт С++
4924 / 3032 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
29.07.2015, 23:38 #2
В этом случае лучше сослаться на сам стандарт. 3.10 Lvalues and rvalues
0
Миниатюры
Value categories. Является ли выражение xvalue?   Value categories. Является ли выражение xvalue?  
Vlad1slav
21 / 21 / 5
Регистрация: 16.09.2009
Сообщений: 111
30.07.2015, 10:21  [ТС] #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"?.
0
ForEveR
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
30.07.2015, 11:34 #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.
Так что все там описано как видно.
1
rat0r
32 / 24 / 4
Регистрация: 16.02.2018
Сообщений: 168
22.04.2018, 00:38 #5
Цитата Сообщение от ForEveR Посмотреть сообщение
К слову, на тему стандарта:
5/7
Это неполный список.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2018, 00:38
Привет! Вот еще темы с ответами:

Является ли формулой следующее выражение? - Логика и множества
Добрые люди помогите решить пару задачек: 1. Исходя из определения логической формулы,определить, является ли формулой следующее...

Является ли выражение заведомо ложным? - Логика и множества
Является ли выражение заведомо ложным (A∪B)∩¬A

Проверить, является ли тавтологией выражение - Логика и множества
Задание такое: С помощью равносильных преобразований проверить, является ли тавтологией выражение ...

Один item в нескольких categories сразу. Наилучшее решение - Ruby on Rails
Доброго времени суток. Как всегда, пишу как припрет. Вот и сейчас назрел вопрос. Задача: В планах четко структурированное приложение, где...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru