运营商应该< for std :: string是否受当前语言环境的影响?

时间:2017-01-24 17:04:42

标签: c++ language-lawyer libstdc++

我对这个事实感到有些惊讶

#include <string>
#include <cassert>
#include <cstdio>

int main()
{
    printf("Floating point format: %.7g\n",1.4);
    std::string a("Hello, World/#");
    std::string b("Hello, World 2");

    assert(a>b); 

    assert(setlocale(LC_ALL,"sv_SE.UTF-8")!=NULL);
    printf("New floating point format: %.7g\n",1.4);

    assert(b<a);
}

http://coliru.stacked-crooked.com/a/1b435636e4ff7161

此程序正常退出。结论,语言环境影响a和b之间的比较。那是对的吗?这意味着当在std :: set等中使用std :: string作为键时,在没有自定义比较函数的情况下,通过更改当前语言环境来打破排序不变量。

2 个答案:

答案 0 :(得分:4)

  

运营商应该&lt; for std :: string是否受当前语言环境影响?

没有。运营商在内部使用std::string::compare。这反过来使用std::string::traits_type进行比较。 std::string::traits_typestd::char_traits<char>,它与区域设置无关。

  

结论,语言环境影响a和b之间的比较。

不能得出这样的结论,因为断言之间的顺序保持不变。

答案 1 :(得分:1)

你的结论是错误的:http://coliru.stacked-crooked.com/a/38971b91c881da2c

a>b相当于b<a,您确定要将a<bb>a用于第二个assert