Нет висячей ссылки для std::min в libc++

Хорошо известно (или должно быть), что привязка результата 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?


person vsoftco    schedule 03.10.2015    source источник
comment
Неопределенное поведение не определено...   -  person T.C.    schedule 03.10.2015
comment
@Т.С. Да, я знаю, было просто любопытно, исправил ли clang это, поскольку это хорошо известная проблема, и она не выдает никаких предупреждений.   -  person vsoftco    schedule 03.10.2015


Ответы (1)


Это УБ. libc++ никак не защищает вас от этого.

person Howard Hinnant    schedule 03.10.2015
comment
Это самый противный вид UB - вроде работает нормально. - person Marshall Clow; 04.10.2015