Сообщение Re[6]: Про перемещение (на примере кода) от 16.03.2025 11:09
Изменено 16.03.2025 11:14 rg45
Re[6]: Про перемещение (на примере кода)
Здравствуйте, Doom100500, Вы писали:
D>Здравствуйте, rg45, Вы писали:
R>>
D>Опа! А это что за синтаксис? Когда появился? Как называется?
А в C++23 появляется ещё один наворот — explicit object parameter. С помощью него обе эти перегрузки можно будет покрыть одной функцией:
Если нужно предоставить не все варианты перегрузок, можно добавить констрейнтов по вкусу:
Нравится?
D>Здравствуйте, rg45, Вы писали:
R>>
R>>class Wrapper {
R>>// . . .
R>> const TrackedClass& get() const & { return _trackedClass; }
R>> TrackedClass&& get() && { return std::move(_trackedClass); }
R>>};
R>>
D>Опа! А это что за синтаксис? Когда появился? Как называется?
А в C++23 появляется ещё один наворот — explicit object parameter. С помощью него обе эти перегрузки можно будет покрыть одной функцией:
class Wrapper {
// . . .
template <typename Self>
decltype(auto) get(this Self&& self) {
return (std::forward<Self>(self)._trackedClass);
}
};
Если нужно предоставить не все варианты перегрузок, можно добавить констрейнтов по вкусу:
class Wrapper {
// . . .
template <typename Self>
requires (
std::is_rvalue_refrence_v<Self>
or std::is_const_v<std::remove_refrerence_t<T>>)
decltype(auto) get(this Self&& self) {
return (std::forward<Self>(self)._trackedClass);
}
};
Нравится?

Re[6]: Про перемещение (на примере кода)
Здравствуйте, Doom100500, Вы писали:
D>Здравствуйте, rg45, Вы писали:
R>>
D>Опа! А это что за синтаксис? Когда появился? Как называется?
А в C++23 появляется ещё один наворот — explicit object parameter. С помощью него обе эти перегрузки можно будет покрыть одной функцией:
Если нужно предоставить не все варианты перегрузок, можно добавить констрейнтов по вкусу:
Нравится?
D>Здравствуйте, rg45, Вы писали:
R>>
R>>class Wrapper {
R>>// . . .
R>> const TrackedClass& get() const & { return _trackedClass; }
R>> TrackedClass&& get() && { return std::move(_trackedClass); }
R>>};
R>>
D>Опа! А это что за синтаксис? Когда появился? Как называется?
А в C++23 появляется ещё один наворот — explicit object parameter. С помощью него обе эти перегрузки можно будет покрыть одной функцией:
class Wrapper {
// . . .
template <typename Self>
decltype(auto) get(this Self&& self) {
return (std::forward<Self>(self)._trackedClass);
}
};
Если нужно предоставить не все варианты перегрузок, можно добавить констрейнтов по вкусу:
class Wrapper {
// . . .
template <typename Self>
requires (
std::is_rvalue_refrence_v<Self>
or std::is_const_v<std::remove_refrerence_t<Self>>)
decltype(auto) get(this Self&& self) {
return (std::forward<Self>(self)._trackedClass);
}
};
Нравится?
