为什么构造 std::string(0) 不会发出编译器警告

Why does constructing std::string(0) not emit a compiler warning?

本文关键字:警告 编译器 std string 为什么      更新时间:2023-10-16

假设我有这段代码。

#include <string>
int main()
{
    std::string(0);
    return 0;
}

编写std::string(0)会导致调用std::basic_string<char>::basic_string(const char*)0作为此构造函数的参数,该构造函数尝试将参数视为指向 C 字符串的指针。

运行此代码显然会导致引发std::logic_error。但我的问题是:为什么GCC和MSVC 8.0都不发出任何警告?我希望看到类似于"从没有强制转换的整数制作指针"的内容。

0 是一个值为 0 的整数常量表达式,因此它是一个空指针常量。 使用 0 值常量作为空指针不是强制转换。

C++11 引入了 nullptr(和 nullptr_t),但将0视为空指针的处理在不久的将来不太可能改变,因为大量代码依赖于它。

因为那些编译器似乎错过了这个功能。我建议给他们写一份专题报告。

编译器可以轻松地在内部重新识别 std 字符串类并发出合理的警告。

我不知道你为什么想把警告限制在无投射的情况下。在那里进行强制转换或以其他方式传递空指针同样是无意义的。