🐛 Задача на выходные: есть ли проблема с deducing this?
C++23 «explicit object parameter» — мощь. Решили сделать zero-overhead геттер с идеальным пробросом самого объекта. На лайвах работает, в проде иногда мусор в строке.
Задача: объясни, какой ровно тип выводится у title() при вызове на rvalue Widget, почему bad ссылается на уничтоженный объект, и где здесь lifetime extension НЕ срабатывает (и почему именно для deducing-this это особенно коварно). Как спроектировать API, чтобы компилятор ловил это?
C++23 «explicit object parameter» — мощь. Решили сделать zero-overhead геттер с идеальным пробросом самого объекта. На лайвах работает, в проде иногда мусор в строке.
struct Widget {
std::string name;
// отдаём name с тем же value-category, что и сам объект
auto&& title(this auto&& self) {
return std::forward<decltype(self)>(self).name;
}
};
const std::string& bad = Widget{"btn"}.title(); // ❓
std::println("{}", bad);
Задача: объясни, какой ровно тип выводится у title() при вызове на rvalue Widget, почему bad ссылается на уничтоженный объект, и где здесь lifetime extension НЕ срабатывает (и почему именно для deducing-this это особенно коварно). Как спроектировать API, чтобы компилятор ловил это?
Просмотры: 146