我在 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_t
和wchar_t[]
之间的operator+
是否定义错误,或者这是一个编译器/库错误?
如果定义错误,编译器是否应该发出警告?
注意:我不是在寻找解决方案/解决方法。将 L"B"
更改为 std::wstring(L"B")
可解决此问题。我想知道是我做错了什么还是编译器做错了。
注意 2: 我还在 Visual Studio C++ 2010 和一个据称使用 g++ 的在线编译器中得到了垃圾结果,并且没有编译错误,所以我倾向于认为该代码无效,即使尽管我预计会出现编译器错误。
最佳答案
firstChar + L"B"
使用 firstChar
的提升值递增字符串文字 L"B"
的地址。它不会连接字符和字符串。这是未定义的行为,因为 std::basic_string
将尝试复制字符串,直到它找到 L'\0'
,这超出了它的原始界限。
std::basic_string
有多个重载运算符,允许这样的操作具有直观的行为,这就是它在那种情况下起作用的原因。
关于c++ - 从表达式 `wchar_t + wchar_t[]` 到 std::wstring 的隐式转换中的垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30854970/