在您的电话中
std::max
存在字符串文字的比较地址。C++中这种比较的结果是未指定的(在C中它是未定义的行为)。
来自C++20标准(7.6.9关系运算符)
-
…左值到右值(7.3.2),数组到指针(7.3.3),以及
函数到指针(7.3.4)的标准转换在
操作数。
如果两个操作数都属于数组,则不赞成进行比较
这些转换之前的类型(D.5)
。
4比较对象的不相等指针81的结果在
偏序的条件,与下列规则一致:
(4.1)如果两个指针指向同一数组的不同元素,
或指向其子对象,指向具有较高值的元素的指针
需要下标才能进行更大的比较。
(4.2)如果两个指针指向
相同的对象,或这些成员的子对象,递归地
需要指向后来声明的成员的指针来比较
如果两个成员具有相同的访问控制(11.9)
成员是零大小的子对象,并且它们的类不是并集。
(4.3)
否则,两个指针都不需要进行大于
另一个
相反,你应该写
#include <cstring>
//...
std::cout << std::max( "5", "4", []( const auto &s1, const auto &s2 ) { return std::strcmp( s1, s2 ) < 0; } ) << "\n";
std::cout << std::max( "4", "5", []( const auto &s1, const auto &s2 ) { return std::strcmp( s1, s2 ) < 0; } ) << "\n";
在这种情况下,输出将是
5
5
也就是说,要比较两个字符串,您需要使用标准字符串函数
strcmp
在标头中声明
<cstring>
。