Re: Reference binding in C++23 - bug of gcc?
От: rg45 СССР  
Дата: 01.02.25 11:10
Оценка: 2 (1)
R>А теперь, внимание, вопрос: что это за хрень?

Резюме.

Главное изменение вот (выделено):

https://timsong-cpp.github.io/cppwp/expr.prim.id.unqual#3

The expression is an xvalue if it is move-eligible (see below); an lvalue if the entity is a function, variable, structured binding, data member, or template parameter object; and a prvalue otherwise ([basic.lval]); it is a bit-field if the identifier designates a bit-field.


"Move-eligible" — новый термин, который является синонимом ранее существовавшего термина "implicitly movable entity". В С++23 они просто перетащили это определение из "Copy/move elision" в "Expressions":

https://timsong-cpp.github.io/cppwp/expr.prim.id.unqual#4

An implicitly movable entity is a variable of automatic storage duration that is either a non-volatile object or an rvalue reference to a non-volatile object type.
In the following contexts, an id-expression is move-eligible:


Так что, гцц опять молодец

P.S. А что нам даёт это изменение? Всё очень просто.

Раньше нужно было писать так (псевдокод):

template <typename T>
T&& foo(T&& t)
{
   modify(t);
   return std::forward<T>(t);
}


Теперь можно писать проще:

auto&& foo(auto&& t)
{
   modify(t);
   return t;
}
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 01.02.2025 16:01 rg45 . Предыдущая версия . Еще …
Отредактировано 01.02.2025 14:01 rg45 . Предыдущая версия .
Отредактировано 01.02.2025 11:27 rg45 . Предыдущая версия .
Отредактировано 01.02.2025 11:26 rg45 . Предыдущая версия .
Отредактировано 01.02.2025 11:26 rg45 . Предыдущая версия .
Отредактировано 01.02.2025 11:17 rg45 . Предыдущая версия .
Отредактировано 01.02.2025 11:14 rg45 . Предыдущая версия .
Отредактировано 01.02.2025 11:13 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.