繁体   English   中英

警告:将NULL传递给'std :: thread :: thread的非指针参数

warning: passing NULL to non-pointer argument of ‘std::thread::thread

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我想要运行的功能:

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

我如何调用该函数:

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

警告:

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

我在这里错过了什么?

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

2 个回复

麻烦的是NULL有点含糊不清。
虽然它在语义上是指针,但它可以(并且在您的实现中)是整数类型。

18.2类型[support.types]

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

4.10指针转换[conv.ptr]

1 空指针常量是值为零的整数文字(2.14.2)或类型为std::nullptr_t
[...]

因此,您的实现决定将其显示为0以实现向后兼容性,但标记它以进行额外诊断。

这对于推广可移植代码实际上是一个值得称道的决定。
虽然很遗憾没有人可以跳进时间机器,只是在标准中使NULLnullptr相同,所以不存在歧义。

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

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

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

1 无法将参数传递给std :: thread?

我正在尝试使用std::thread 。 我的线程应该调用一个方法并传递一个struct作为参数,正如许多例子所示。 除了我非常简单的代码将无法编译。 为了记录,我知道这个问题,但似乎没有任何帮助我。 在哪里我称之为线程: write_to_disk的签名: writ ...

3 将多个参数传递给 std::thread

我问的是 C++11 标准中的<thread>库。 假设你有一个类似的功能: 您如何将所有这些参数传递到线程中? 我尝试列出如下参数: 但它抱怨没有这样的构造函数。 解决这个问题的一种方法是定义一个结构来打包参数,但还有另一种方法可以做到这一点吗? ...

4 将CSocket传递给std :: thread

我正在使用CSocket编写多线程服务器。 因此,通常,我有监听服务器套接字,并且需要为每个连接的客户端创建接收套接字。 为了提供多个客户端处理,我想为每个客户端创建新的std::thread , detach其detach ,然后在线程函数内处理该客户端。 我正在尝试这样做: ...

5 当指向对象的指针作为参数传递给 std::thread 时的内存可见性

假设有一个简单的Counter类,它包含一个整数成员count 。 构造一个新的Counter对象并将count初始化为某个数字。 现在,如果我将指向此对象的指针作为参数传递给新线程,新线程是否会始终立即看到在主线程中初始化的值? 如果是这样,一个不同的线程如何能够在没有任何显式同步的情况下看到主 ...

6 将指针传递给 std::thread 时的数据竞争

我对 GCC 8 和 Clang 9 都出现的线程消毒器报告感到困惑(我还没有尝试过其他的)。 有一个带有以下代码的 struct Bar : 在 Ubuntu 18.04 上使用两个编译器运行线程清理程序表明线程创建行(请参阅上面的评论)是数据竞争。 使用该线程的唯一其他地方 ( mFooTh ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM