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

问题描述 投票:0回答:2

假设我有这段代码。

#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 都不发出任何警告?我希望看到类似“从整数创建指针而不进行强制转换”的内容。

c++ stl compiler-warnings
2个回答
9
投票

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

C++11 引入了

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


1
投票

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

编译器可以轻松地在内部重新识别 std string 类并发出明智的警告。

我不知道为什么你想将警告限制在无铸件的情况下。在那里进行强制转换或以其他方式传递空指针同样是荒谬的。

© www.soinside.com 2019 - 2024. All rights reserved.