说我有这段代码。
#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 :(得分:9)
0
是一个整数常量表达式,其值为0,因此它是一个空指针常量。使用0值常量作为空指针不是强制转换。
C ++ 11引入了nullptr
(和nullptr_t
),但是0
作为空指针的处理在不久的将来不太可能改变,因为大量的代码依赖于它
答案 1 :(得分:1)
因为那些编译器似乎错过了这个功能。我建议给它们写一个featurereport。
编译器可以在内部轻松地重新标识std字符串类并发出合理的警告。
我不知道为什么你只想把警告限制在无铸造的情况下。在那里进行强制转换或以其他方式传递空指针同样不易察觉。