Bug in std::wstring?

Bug in std::wstring?

本文关键字:wstring std in Bug      更新时间:2023-10-16

我发现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实际上不起作用。

任何想法?

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" ");

在这种情况下可能更简单的做法是只使用两条语句。

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