В обоих случаях T
определяется как char [6]
. При сравнении массив распадается на указатель на первый элемент массива - char*
. Таким образом, вы сравниваете два указателя, и результат непредсказуем, потому что вы не знаете, как эти строковые литералы - «привет» и «мир» - помещаются в память, у которой более низкий адрес.
Вы получаете 0 (что должно быть невозможно, потому что привет и world , поскольку строковые литералы не могут занимать одну и ту же память), потому что эти условия
if(val1 < val2) return -1;
if(val2 > val1) return 1; // condition val1 > val2 was not tested
// return 0
одинаковы.
Должно быть:
if(val1 < val2) return -1;
if(val1 > val2) return 1;
Посетите GodBolt и посмотрите, какой код генерируется, когда строка
std::string v1= "hello", v2 = "world";
прокомментировано.
[1], когда не комментируется код:
.LC0:
.string "hello"
.LC1:
.string "world"
main:
push rbp
mov rbp, rsp
push rbx
[2] при комментировании
.LC0:
.string "world"
.LC1:
.string "hello"
main:
push rbp
mov rbp, rsp
mov esi, OFFSET
Вы видите это сейчас? LC0
и LC1
являются памятью меток (некоторые значения сравниваются), поэтому вывод непредсказуем, зависит от того, как компилятор хранит строковые литералы в памяти, что является первым.