我在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 ++的在线编译器中也得到了一个垃圾结果,没有编译错误,所以我倾向于那个代码无效,甚至虽然我希望编译错误。
答案 0 :(得分:4)
firstChar + L"B"
使用提升值L"B"
递增字符串文字firstChar
的地址。它不会连接字符和字符串。这是未定义的行为,因为std::basic_string
将尝试复制字符串,直到找到L'\0'
,超出其原始范围。
std::basic_string
有多个重载运算符,允许这样的操作具有直观行为,这就是为什么它在这种情况下有效。