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

标签 c++ implicit-conversion undefined-behavior

我在 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+ 是否定义错误,或者这是一个编译器/库错误? 如果定义错误,编译器是否应该发出警告?


注意:我不是在寻找解决方案/解决方法。将 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/

相关文章:

c++ - 如何在 C++ 中将 Windows DATE 转换为 Unix 时间

c++ - 通过覆盖虚函数获取 'unresolved external symbol'

javascript - 类型错误 : radioButton[i] is undefined

c++ - 未定义的行为和顺序点

c - 对结构成员的不优雅访问

C++ 等价于 Tidy

c++ - 有没有办法在同一图像 opencv C++ 上同时拥有灰度和 rgb 像素?

c# - 如何警告由于类型转换导致的潜在算术错误?

c - void * 指针是否用于 C 中的泛型类型?

C# 隐式转换和从 Object 的转换