关于so​​laris(x86)上的std :: basic_string的一些难题

Wen*_*ang 4 c++ solaris stl

关于so​​laris(x86)上的std :: basic_string的一些难题

#include <iostream>
#include <string>
int main()
{
    const wchar_t* s = L"abcdef";
    std::wstring ws(s, s+6);
    for(int i = 0; i < ws.size(); ++i)
    {
        std::cout << ws[i] << std::endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

运行结果是:

97
99
101
0
0
0
Run Code Online (Sandbox Code Playgroud)

为什么不呢

97
98
99
100
101
102
Run Code Online (Sandbox Code Playgroud)

和代码

#include <iostream>
#include <string>
int main()
{
    const wchar_t* s = L"abcdef";
    std::wstring ws;
    ws.resize(6);       
    for(int i = 0; i < ws.size(); ++i)
    {
        std::cout << (ws[i] = s[i]) << std::endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

可以得到预期的结果.我用gcc 3.4.6,build命令是g++ -fshort-wchar stringtest.cpp.任何人都可以给出一个表达?

Naw*_*waz 5

-fshort-wchar读取文档,

-fshort-wchar

覆盖基础类型wchar_tshort unsigned int而不是默认的目标.此选项对于构建在WINE下运行的程序很有用.

警告: -fshort-wchar开关导致GCC生成的代码与不使用该开关生成的代码不是二进制兼容的.使用它来符合非默认应用程序二进制接口.

所以看起来这个标志导致观察到的差异,并且由于语言规范没有讨论这样的标志,所以行为可以被分类为实现定义的或未定义的.


作为旁注,您应该使用wcout而不是cout处理宽字符时,因为wcout它设计用于处理宽字符:

  • cout是一个类型的对象 basic_ostream<char>.
  • wcout是一个类型的对象 basic_ostream<wchar_t>.

想想,在这种情况下,问题不是你用来打印值的问题,因为你告诉编译器无论如何都要将其wchar_t视为short unsigned int.