Описание тега 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…
27 окт '18 в 06:48
1
ответ
Преобразование Lvalue в rvalue для типов классов: происходит ли копирование?
(Я задавал этот вопрос раньше, но не привел жизнеспособного примера, поэтому я удалил предыдущий. Надеюсь, что на этом я понял пример правильно.) Случай: #include <iostream> struct S { S() = default; S(const S &) { std::cout << "Copy…
29 янв '18 в 02:13
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…
08 сен '17 в 04:05
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>) было бы допустимым выражением, без …
14 авг '17 в 19:03
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, по-…
29 апр '17 в 17:38
2
ответа
xvalues vs prvalues: what does identity property add
Прошу прощения за широту вопроса, просто все эти детали тесно взаимосвязаны.. Я пытался понять разницу между конкретно двумя категориями значений - xvalues и prvalues, но все же я запутался. Так или иначе, ментальная модель, которую я пытался разр…
26 июл '17 в 04:56
2
ответа
Почему здесь используется термин "объект" при упоминании prvalue?
Насколько я знаю, в C++17 концепция / семантика prvalue больше не является временным объектом, поэтому во многих случаях разрешение на копирование является обязательным. Однако сегодня я наткнулся на описание обратного выражения Если выражение являе…
24 мар '18 в 07:14
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’ …
15 ноя '18 в 21:52
1
ответ
Поведенческие различия в 5 против стандартного: переместить (5)
Я прочитал все основные вопросы по SO о различных категориях значений, но до сих пор не ясно понимаю разницу между, в данном случае, xvalues и prvalues. Я знаю, что, как и все glvalues, xvalues может иметь свой динамический тип, отличный от стат…
19 июл '17 в 12:31
1
ответ
Какие шаги я должен предпринять, чтобы определить категорию значения выражения?
Я довольно озадачен определением ценностной категории выражения. Не могли бы вы предоставить основные шаги, которые следует предпринять (что следует проанализировать) для определения категории значения выражения?
30 май '19 в 18:51