3

假设我有这段代码。

#include <string>

int main()
{
    std::string(0);
    return 0;
}

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

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

4

2 回答 2

9

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

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

于 2012-11-15T09:03:23.277 回答
1

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

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

我不知道您为什么要将警告仅限制在无演员表的情况下。在那里进行强制转换或以其他方式传递空指针同样是不明智的。

于 2012-11-15T09:07:10.017 回答