Сообщение const& от 10.10.2025 8:25
Изменено 10.10.2025 8:52 Videoman
const&
Опять что-то перемудрили в стандарте или я неправильно понимаю ссылочные квалификаторы у методов класса?
Обнаружил падение у себя в коде. В сухом остатке вот выжимка. Код содержит undefined behavior.
В оправдании себя: думал что 'const&' квалификатор метода класса убережет меня от вызова метода у временного объекта. Но не уберегло, не фортануло. Стандарт позволяет вызвать метод у временного константного объекта. Дальше масса объяснений зачем это, что ссылка константная и она продлевается и это безопасно и бла-бла-бла. Во у меня рабочий пример и таки приведение оказалось не безопасным. Понятно, что можно добавить метод
Обнаружил падение у себя в коде. В сухом остатке вот выжимка. Код содержит undefined behavior.
class nested_class
{
public:
int get() const { return m_member; };
private:
int m_member = 0;
};
class holder_class
{
public:
template<typename type_t>
const nested_class& get() const& { return m_member; }
private:
nested_class m_member;
};
int main(int argc,char** argv) {
const nested_class& nested = holder_class().get<int>(); // UB
return nested.get();
}В оправдании себя: думал что 'const&' квалификатор метода класса убережет меня от вызова метода у временного объекта. Но не уберегло, не фортануло. Стандарт позволяет вызвать метод у временного константного объекта. Дальше масса объяснений зачем это, что ссылка константная и она продлевается и это безопасно и бла-бла-бла. Во у меня рабочий пример и таки приведение оказалось не безопасным. Понятно, что можно добавить метод
template<typename type_t>
nested_class get() const&& = delete; и всё будет работать как задумано. Но почему такое поведение по умолчанию, где я ошибся в своей логике-реализации ?const&
Опять что-то перемудрили в стандарте или я неправильно понимаю ссылочные квалификаторы у методов класса?
Обнаружил падение у себя в коде. В сухом остатке вот выжимка. Код содержит undefined behavior.
В оправдании себя: думал что 'const&' квалификатор метода класса убережет меня от вызова метода у временного объекта. Но не уберегло, не фортануло. Стандарт позволяет вызвать метод у временного константного объекта. Дальше масса объяснений зачем это, что ссылка константная и она продлевается и это безопасно и бла-бла-бла. Во у меня рабочий пример и таки приведение оказалось не безопасным. Понятно, что можно добавить метод
Обнаружил падение у себя в коде. В сухом остатке вот выжимка. Код содержит undefined behavior.
class nested_class
{
public:
int get() const { return m_member; };
private:
int m_member = 0;
};
class holder_class
{
public:
template<typename type_t>
const nested_class& get() const& { return m_member; }
private:
nested_class m_member;
};
int main(int argc,char** argv) {
const nested_class& nested = holder_class().get<int>(); // UB
return nested.get();
}В оправдании себя: думал что 'const&' квалификатор метода класса убережет меня от вызова метода у временного объекта. Но не уберегло, не фортануло. Стандарт позволяет вызвать метод у временного константного объекта. Дальше масса объяснений зачем это, что ссылка константная и она продлевается и это безопасно и бла-бла-бла. Во у меня рабочий пример и таки приведение оказалось не безопасным. Понятно, что можно добавить метод
template<typename type_t>
nested_class get() const&& = delete; и всё будет работать как задумано. Но почему такое поведение по умолчанию, где я ошибся в своей логике-реализации ?