Описание тега value-categories

Категории значений - это таксономия в C++ для классификации выражений. Это rvalue, lvalue, xvalue, glvalue и prvalue.
1 ответ

Возвращение ссылки на член const stuct (типа указателя): видимое преобразование lvalue в rvalue

Учитывая следующий код, GCC выдает некоторые неожиданные ошибки и предупреждения. Я пытаюсь вернуть элемент структуры по ссылке, и он говорит, что я возвращаю временный! Кроме того, при попытке исправить эту функцию, он жалуется на ошибку преобразов…
08 авг '18 в 00:30
2 ответа

Допустимо ли приводить не-классное не-массивное prvalue к cv-квалифицированному типу?

Я читал о категориях значений и натолкнулся на следующее (для краткости многое опущено): Следующие выражения являются выражениями prvalue: литерал (кроме строкового литерала), такой как 42, true или nullptr; Свойства: Некваливный prvalue, не являющи…
21 мар '17 в 14:53
1 ответ

Тернарный оператор с операндами xvalue

Скажем, у нас есть троичный оператор с 2 операндами xvalue. struct A { A() { std::cout<<"A ctor"<<std::endl; } ~A() { std::cout<<"A dtor"<<std::endl; } A(A const&) { std::cout<<"A copy ctor"<<std::endl; } A(A&…
19 ноя '18 в 11:59
2 ответа

Условное перемещение или копирование присваивания в троичном операторе

Для следующего фрагмента кода: #include <utility> #include <iostream> #define C(name) (name ? name : "nullptr") #define PP { std::cout << __PRETTY_FUNCTION__ << " : " << C(name) << '\n'; } #define T { std::cout &l…
1 ответ

Преобразование Lvalue в rvalue для типов классов: происходит ли копирование?

(Я задавал этот вопрос раньше, но не привел жизнеспособного примера, поэтому я удалил предыдущий. Надеюсь, что на этом я понял пример правильно.) Случай: #include <iostream> struct S { S() = default; S(const S &) { std::cout << "Copy…
2 ответа

std::map insert && перегрузка вызывает копирование

Глядя на этот интересный разговор: CppCon 2017: Мэтт Кулукундис "Создание быстрой, эффективной и удобной для кэширования хэш-таблицы, шаг за шагом" Около минуты 38:32 он упоминает, что void Benchmark_Slow(int iters) { std::unordered_map<string, i…
17 май '18 в 18:49
1 ответ

Где стандарт определяет порядок предпочтения для привязки значений к ссылкам?

Как объясняется здесь, значения разных категорий привязываются к ссылкам разных видов в соответствии со следующим порядком предпочтения: struct s {}; void f ( s&); // #1 void f (const s&); // #2 void f ( s&&); // #3 void f (const s&a…
1 ответ

Сохраняются ли присвоения результату условных выражений, в которых второй и третий операнды являются переменными одного типа и категории значений?

Узнав о категориях значений, я обнаружил, что следующий фрагмент скомпилирован и работает очень хорошо: #include <iostream> int main() { int x = 1; int y = 2; (true ? x : y) = 4; std::cout << x << std::endl; } Вот вывод: 4 Сначала …
22 мар '17 в 17:27
1 ответ

Есть ли значение, по которому я могу напрямую взять адрес?

Я могу получить адрес rvalue путем привязки к ссылке (на которую, как я понимаю, может ссылаться только lvalue). Есть ли способ получить Rvalue, что я могу напрямую взять адрес (например, как &(<rvalue>) было бы допустимым выражением, без …
1 ответ

Что они имеют в виду, имея идентичность, но не перемещаемую для Lvalue в C++ 11?

Сейчас я изучаю C++ 11 и смущаюсь категорией значений выражений в C++ 11. Согласно терминологии, Lvalue - это верхняя левая точка W, то есть iM (или иногда im) означает, что "имеет тождество, но не может быть перемещено". от". Это действительно меня…
31 май '17 в 15:53
1 ответ

Почему std::move() работает в C++?

Ниже приведен фрагмент кода: int i=0; int&&k=std::move(i); В праймере с ++ ход template <typename T> typename remove_reference<T>::type &&move(T&& t) {return static_cast<typename remove_reference<T>::type…
22 фев '18 в 14:57
2 ответа

Увеличение продолжительности жизни, значения и значения

После хорошо принятого ответа на этот вопрос Допускают ли ссылки на rvalue висячие ссылки? Казалось бы, значения xvalue не продлеваются, когда они присваиваются rvalue-ссылке lvalue, как в вопросе. Однако, когда я делаю это #include <iostream>…
24 фев '17 в 15:00
0 ответов

Категория значений переменной const int, захваченная лямбда-выражением

Я пытался понять, когда и когда лямбда с odr по умолчанию для захвата использует переменную с автоматическим сроком хранения, определенным в его окружении (вызвано этим ответом). Исследуя это, я натолкнулся на небольшое любопытство. GCC и Clang, по-…
2 ответа

xvalues vs prvalues: what does identity property add

Прошу прощения за широту вопроса, просто все эти детали тесно взаимосвязаны.. Я пытался понять разницу между конкретно двумя категориями значений - xvalues ​​и prvalues, но все же я запутался. Так или иначе, ментальная модель, которую я пытался разр…
26 июл '17 в 04:56
2 ответа

Почему здесь используется термин "объект" при упоминании prvalue?

Насколько я знаю, в C++17 концепция / семантика prvalue больше не является временным объектом, поэтому во многих случаях разрешение на копирование является обязательным. Однако сегодня я наткнулся на описание обратного выражения Если выражение являе…
3 ответа

Что представляет собой адрес ссылки lvalue на prvalue?

Когда параметр функции имеет тип lvalue ссылка lref: void PrintAddress(const std::string& lref) { std::cout << &lref << std::endl; } а также lref связан с prvalue: PrintAddress(lref.substr() /* temporary of type std::string */) ч…
12 мар '17 в 20:05
2 ответа

В чем разница между обычной ссылкой на rvalue и ссылкой, возвращаемой std::forward?

Я не могу сделать это: int &&q = 7; int &&r = q; //Error Message: //cannot convert from 'int' to 'int &&' //You cannot bind an lvalue to an rvalue reference Если я правильно понимаю, при инициализации ссылки на rvalue есть ин…
24 авг '18 в 06:04
1 ответ

Категория значений условного оператора

Рассмотрим следующий код: int x; int& f() { return x ? x : throw 0; } С gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04) Я получаю следующую ошибку компиляции: cannot bind non-const lvalue reference of type ‘int&’ to an rvalue of type ‘int’ …
1 ответ

Поведенческие различия в 5 против стандартного: переместить (5)

Я прочитал все основные вопросы по SO о различных категориях значений, но до сих пор не ясно понимаю разницу между, в данном случае, xvalues ​​и prvalues. Я знаю, что, как и все glvalues, xvalues ​​может иметь свой динамический тип, отличный от стат…
19 июл '17 в 12:31
1 ответ

Какие шаги я должен предпринять, чтобы определить категорию значения выражения?

Я довольно озадачен определением ценностной категории выражения. Не могли бы вы предоставить основные шаги, которые следует предпринять (что следует проанализировать) для определения категории значения выражения?
30 май '19 в 18:51