3

我要运行的功能:

struct foo;
void bar(const foo* p = 0);

我如何调用函数:

auto thread = std::thread(&bar, NULL);

警告:

foob​​ar.h:223:9:警告:将 NULL 传递给 'std::thread::thread(_Callable&&, _Args&& ...) 的非指针参数 2 [with _Callable = void (*)(const foo*), _Args = {int}]' [-Wconversion-null]

我在这里想念什么?

当我用非NULL参数调用函数时,警告消失了。

4

2 回答 2

5

问题是这NULL有点模棱两可。
虽然它在语义上是一个指针,但它可以(并且在您的实现中)是整数类型。

18.2 类型[support.types]

3 该宏NULL是本国际标准 (4.10) 中实现定义的 C++空指针常量

4.10 指针转换[conv.ptr]

1空指针常量是一个整数文字 (2.14.2),其值为 0 或类型为 prvalue std::nullptr_t
[...]

因此,您的实现决定明确0表示向后兼容,但将其标记为额外的诊断。

这实际上是促进可移植代码的一个值得称赞的决定。
虽然很遗憾没有人可以跳进时间机器并在标准中制作NULL相同的东西nullptr,所以不存在歧义。

要解决该错误,请使用正确类型的指针,nullptr而不是NULL或者,更复杂且不太好,使用正确类型的指针。

于 2015-01-14T20:25:45.497 回答
2

问题是这NULL是一个值为 0 的宏。模板参数推导推导出了NULLas的类型int(从警告的末尾可以看出)。然而NULL,按惯例用于指针参数,而不是整数参数。因此编译器会警告您正在将参数传递NULLint参数。更糟糕的是,这在技术上是错误的,因为不再保证非常量整数 0 参数可转换为空指针。

正确的解决方案是nullptr。正如名称已经暗示的那样,这是一个指针而不是整数。

于 2015-01-14T20:09:53.407 回答