从表达式 `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_t
和 wchar_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
有多个重载运算符,允许这样的操作具有直观的行为,这就是它在那种情况下起作用的原因。
我在 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+
是不是定义错误,或者这是一个 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
有多个重载运算符,允许这样的操作具有直观的行为,这就是它在那种情况下起作用的原因。