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

时间:2012-11-15 09:02:07

标签: c++ compiler-construction stl compiler-warnings

说我有这段代码。

#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都没有发出任何警告?我期待看到“从没有演员表的整数制作指针”这一行的内容。

2 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:1)

因为那些编译器似乎错过了这个功能。我建议给它们写一个featurereport。

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

我不知道为什么你只想把警告限制在无铸造的情况下。在那里进行强制转换或以其他方式传递空指针同样不易察觉。