为什么构造 std::string(0) 不会发出编译器警告
Why does constructing std::string(0) not emit a compiler warning?
假设我有这段代码。
#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 字符串类并发出合理的警告。
我不知道你为什么想把警告限制在无投射的情况下。在那里进行强制转换或以其他方式传递空指针同样是无意义的。
相关文章:
- 如何修复编译器警告 C6386 和 C6385?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 为什么布尔开关语句有编译器警告?
- 奇怪的缩小转换在 g++ 编译器中加倍到浮点警告
- 处理编译器关于可能丢失数据的警告的最优雅方法是什么
- 使用 reverse_iterator 而不是const_reverse_iterator并获得讨厌的编译器警告和错误
- 添加 c++11 编译器后打开 devc++ 时显示的警告
- 来自 std::chrono 的编译器警告,但未被使用
- 警告级别为 3 的 int 的 std::vector push_back 处的编译器警告
- G++ 编译器未为未定义的方法生成错误/警告
- 从 int 中剥离位时,编译器会警告一个转换,但不警告其他转换.有解决方法吗?
- 有没有办法在从临时返回按值string_view时获得编译器警告?
- 常量更改而不const_cast<> 为什么没有编译器警告/错误?
- 为什么编译器不在同一翻译单元中警告 ODR 违规
- C++语法错误,编译器不会警告或 int v = func(&v) 出错;
- C++ 添加编译器警告,以错误使用自定义打印/日志功能
- 我正在尝试在我的类中创建一个静态成员,但编译器警告我它是未定义的
- 是否可以将移动的变量标记为不再可用,并在使用它时收到编译器警告?
- 为什么我应该始终启用编译器警告
- 使用Boost :: black在boost :: variant中使用时,请警告编译器