Здравствуйте, 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 вызываются, ссылки валидные. Но когда выражение завершается, уничтожаются все временные объекты, созданные в процессе его выполнения, поэтому ссылка и протухает.
Именно из-за этого ссылку нельзя сохранять. Но вот передать ее в конструктор объекта (как в примере) можно, т.к. она все еще валидная.