Хорошо известно (или должно быть), что привязка результата std::min
к ссылка const
- очень плохая идея, когда один из аргументов std::min
является значением r, поскольку привязка ссылки const
не распространяется через возврат функции. Итак, следующий код
#include <iostream>
#include <algorithm>
int main()
{
int n = 42;
const int& r = std::min(n - 1, n + 1); // r is dangling after this line
std::cout << r;
}
должно привести к неопределенному поведению, поскольку r
болтается. И действительно, при компиляции с gcc5.2 с -Wall -O3
компилятор выплевывает
предупреждение:
<anonymous>
используется неинициализированным в этой функции [-Wuninitialized]
Однако компиляция с clang (llvm 7.0.0) с теми же флагами (даже с учетом -Wextra
) не выдает никаких предупреждений, и программа вроде бы "работает", т.е. выводит 41
.
Вопрос. Использует ли clang "безопасную" версию std::min
? Как версия, которая использует некоторые SFINAE для возврата по значению всякий раз, когда один из аргументов является значением r? Или просто не требуется выдавать какую-либо диагностику, и программа «случайно» выдает «правильный» результат в этом сценарии UB?