从表达式 `wchar_t + wchar_t[]` 到 std::wstring 的隐式转换中的垃圾值

Garbage value in implicit conversion from expression `wchar_t + wchar_t[]` to std::wstring

我在 Visual Studio C++ 2013 Community Edition 中遇到了一些奇怪的事情,这可能是编译器错误,或者我正在编写编译时没有警告的无效代码。

考虑以下片段:

#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" 但我得到的是随机垃圾。

我的问题:wchar_twchar_t[] 之间的 operator+ 是不是定义错误,或者这是一个 compiler/library 错误? 在定义错误的情况下,编译器是否应该发出警告?


注:我不是在找solution/workaround。将 L"B" 更改为 std::wstring(L"B") 可解决问题。我想知道是我做错了什么还是编译器做错了。

注意 2: 我在 Visual Studio C++ 2010 和一个据称使用 g++ 的在线编译器中也得到了垃圾结果,并且没有编译错误,所以我倾向于该代码无效,即使我预计会出现编译器错误。

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

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