инициализация ссылки из-за проблемы с данными о членах временного объекта - PullRequest
0 голосов
/ 04 мая 2020

Неконстантная ссылка может быть привязана только к lvalue, поэтому я попробовал это:

struct Foo
{
    double value = 5.45;
    operator double&(){return value;}
};

int main()
{

    double& d = Foo{};
    cout << d << endl; // seems ok 5.45

}
  • d - это ссылка, инициализированная из неназванного временного объекта Foo{} данные члена value, но этот временный объект уничтожается в следующей точке с запятой, что означает, что он уничтожает также его член value, но d все еще ссылается на него. Так почему же я получаю правильное значение 5.45? Мой код дает UB? d - это свисающая ссылка? пожалуйста, объясните спасибо!

Ответы [ 2 ]

2 голосов
/ 04 мая 2020

Так почему я получаю правильное значение 5,45?

Поскольку поведение программы не определено.

Дает ли мой код UB?

Да. Вы обращаетесь к объекту за пределами его времени жизни.

Является ли ссылка сейчас свисающей?

Да. Как вы сказали: временный объект вместе с его членом был уничтожен. Все ранее действительные ссылки на уничтоженный объект стали недействительными, т. Е. Свисающими.

// seems ok 5.45

Может показаться, что все в порядке, но, тем не менее, не в порядке.

0 голосов
/ 04 мая 2020

Если «d» все еще ссылается на «значение», а «d» является неконстантной ссылкой lvalue типа «double &», согласны? Тогда вы пытались связать 'd' со значением типа 'double'?

...