Информация об изменениях

Сообщение const& от 10.10.2025 8:25

Изменено 10.10.2025 8:52 Videoman

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.
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;
и всё будет работать как задумано. Но почему такое поведение по умолчанию, где я ошибся в своей логике-реализации ?