Вы возвращаете char * по значению из своего среднего 2-параметра max () в три параметра max (), которые затем возвращают это временное значение по ссылке.
Вместо этого возьмите char * 's по ref, тоже.Вам также нужно потерять константы на вашем 3-х стороннем максимуме, чтобы вы не получили константные char * const's.Вдобавок ко всему, вам также нужно правильно обрабатывать значения r, что, я думаю, приведенный ниже код, по крайней мере, приближает к выполнению.Вы должны рассмотреть квалифицированный оператор r-значения <. </p>
#include <string.h>
#include <type_traits>
#include <utility>
struct C {
bool operator<(C const & c) && {return false;}
};
// overload max(a, b) for char* arguments
const char*& max(const char*& a, const char*& b) {
return strcmp(b, a) < 0 ? a : b;
}
template<typename T>
decltype(auto) max(T&& a, T&& b) {
return std::forward<T>(b) < std::forward<T>(a) ? std::forward<T>(a) : std::forward<T>(b);
}
template<typename T>
decltype(auto) max(T&& a, T&& b, T&& c) {
return max(max(std::forward<T>(a), std::forward<T>(b)), std::forward<T>(c));
}
int main() {
const char* a = "aaa";
const char* b = "bbb";
const char* c = "ccc";
auto result = max(a, b, c);
// this correctly prints "ccc"
max(1, 2, 3);
max("a", "b", "c");
max (C(), C(), C());
return 0;
}
https://godbolt.org/z/sMo9dx