从表达式`wchar_t + wchar_t []`到std :: wstring

时间:2015-06-15 21:05:35

标签: c++ implicit-conversion undefined-behavior

我在Visual Studio C ++ 2013社区版中遇到了一些奇怪的东西,这可能是一个编译器错误,或者我正在编写无编译但没有警告的编译。

请考虑以下代码段:

#include <string>
#include <iostream>

int main()
{
    std::wstring text;
    wchar_t firstChar = 'A';
    text = firstChar + L"B";
    std::wcout << text << std::endl;

    return 0;
}

我希望输出为“AB”,但我得到的是随机垃圾。

我的问题:operator+wchar_t之间的wchar_t[]是否定义错误,或者这是编译器/库错误? 如果定义不明确,编译器是否应该发出警告?

注意:我不是在寻找解决方案/解决方法。将L"B"更改为std::wstring(L"B")可解决问题。我想知道的是,如果我做错了什么或编译器做了什么。

注2:我在Visual Studio C ++ 2010和一个据说使用g ++的在线编译器中也得到了一个垃圾结果,没有编译错误,所以我倾向于那个代码无效,甚至虽然我希望编译错误。

1 个答案:

答案 0 :(得分:4)

firstChar + L"B"使用提升值L"B"递增字符串文字firstChar的地址。它不会连接字符和字符串。这是未定义的行为,因为std::basic_string将尝试复制字符串,直到找到L'\0',超出其原始范围。

std::basic_string有多个重载运算符,允许这样的操作具有直观行为,这就是为什么它在这种情况下有效。