std :: wstring中的错误?

时间:2015-10-19 08:23:00

标签: c++

我发现了std :: wstring的一些非常奇怪的行为。

#include "stdafx.h"
#include <string>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    std::wstring someString = L"Some dummy string";

    std::wstring base1 = L"Base1 ";
    std::wstring base2 = L"Base2 ";
    std::wstring second = L"Second";

    base1 += second.at(0) + L" ";

    base2 += second.at(0);
    base2 += L" ";

    return 0;
}

base1和base2输出应该相同,但没有。 Base1实际上不起作用。

有什么想法吗?

1 个答案:

答案 0 :(得分:8)

second.at(0) + L" "

此表达式不符合您的预期。 at(0)返回wchar_t,这实际上是一个整数。 L" "是一个宽字符串文字,隐式转换为wchar_t const*。所以在上面的表达式中,你正在做指针运算,添加L'S'的任何值(可能与S的ASCII值相同,我相信这是83。)这会给你一个远远超出字符串文字范围的指针,它只有2个字符。最终结果是未定义的行为。

要获得您可能想要的效果,您可以将其中一个操作数设为wstring

base1 += second.at(0) + std::wstring(L" ");

在这种情况下可能更简单的就是使用2个语句。

base1 += second.at(0);
base1 += L' ';