Как концепция тривиального перемещения из C++26 меняет наши рассуждения о категориях значений?
Взаимодействуют ли они вообще (например, правила временной материализации)?
Например, если у меня есть переменная (so lvalue) для тривиально перемещаемого типа и я перемещаю значение куда-то, создает ли она значение prvalue вместо значения x?
Становится ли UB для использования указателя на перемещенное значение?
Пример кода для иллюстративных целей (как указано в комментариях):
struct X
trivially_relocatable
replaceable_if_eligible
{
// ...
};
struct Y
trivially_relocatable
replaceable_if_eligible
{
X some_x;
};
void f()
{
// Point 3: is the initialization of `x` a prvalue?
X x = Y{}.some_x;
}
void g()
{
Y y;
// ...
// Point 4: assuming `y` has been relocated, is the following an UB?
(&y)->some_x;
}
[list] [*]Как концепция тривиального перемещения из C++26 меняет наши рассуждения о категориях значений? [*]Взаимодействуют ли они вообще (например, правила временной материализации)? [*]Например, если у меня есть переменная (so lvalue) для тривиально перемещаемого типа и я перемещаю значение куда-то, создает ли она значение prvalue вместо значения x? [*]Становится ли UB для использования указателя на перемещенное значение? [/list] Пример кода для иллюстративных целей (как указано в комментариях): struct X trivially_relocatable replaceable_if_eligible { // ... };
struct Y trivially_relocatable replaceable_if_eligible { X some_x; };
void f() { // Point 3: is the initialization of `x` a prvalue? X x = Y{}.some_x; }
void g() { Y y;
// ...
// Point 4: assuming `y` has been relocated, is the following an UB? (&y)->some_x; }