Re[5]: MSVC: A non-const reference may only be bound to an l
От: so5team https://stiffstream.com
Дата: 26.07.23 13:13
Оценка:
Здравствуйте, Sm0ke, Вы писали:

S>Чтож, читаем notes по вашей ссылке:


S>

S>Notes
S>Capturing the result of std::max by reference produces a dangling reference if one of the parameters is a temporary and that parameter is returned:

S>int n = 1;
S>const int& r = std::max(n — 1, n + 1); // r is dangling


S>При передаче в эту функцию временного объекта и при привязке по const ref результата будет провисшая ссылка на уже разрушенный объект.

S>Так что будьте осторожней со стандартным максом

Это да. Но поинт в том, что пока std::max работает, у вас валидная ссылка. Иначе бы вот такой вот пример не работал бы:
#include <string>
#include <iostream>

using namespace std::string_literals;

int main()
{
    auto v = std::max(std::max(std::max("One"s, "Two"s), "Three"s), "Zero"s);
    std::cout << v << std::endl;
}

Но он работает.

Потому что в выражении, где std::max вызываются, ссылки валидные. Но когда выражение завершается, уничтожаются все временные объекты, созданные в процессе его выполнения, поэтому ссылка и протухает.

Именно из-за этого ссылку нельзя сохранять. Но вот передать ее в конструктор объекта (как в примере) можно, т.к. она все еще валидная.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.