假设我有这段代码。
#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 string 类并发出明智的警告。
我不知道为什么你想将警告限制在无铸件的情况下。在那里进行强制转换或以其他方式传递空指针同样是荒谬的。