我正在尝试使用std::thread 。 我的线程应该调用一个方法并传递一个struct作为参数,正如许多例子所示。 除了我非常简单的代码将无法编译。 为了记录,我知道这个问题,但似乎没有任何帮助我。 在哪里我称之为线程: write_to_disk的签名: writ ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我想要运行的功能:
struct foo;
void bar(const foo* p = 0);
我如何调用该函数:
auto thread = std::thread(&bar, NULL);
警告:
foobar.h:223:9:警告:将NULL传递给'std :: thread :: thread的非指针参数2(_Callable &&,_ Args && ...)[与_Callable = void(*)(const foo *),_ Args = {int}]'[ - Wconversion-null]
我在这里错过了什么?
当我使用非NULL
参数调用该函数时,警告消失。
麻烦的是NULL
有点含糊不清。
虽然它在语义上是指针,但它可以(并且在您的实现中)是整数类型。
18.2类型
[support.types]
3宏
NULL
是本国际标准(4.10)中实现定义的C ++ 空指针常量 。
4.10指针转换
[conv.ptr]
1 空指针常量是值为零的整数文字(2.14.2)或类型为
std::nullptr_t
。
[...]
因此,您的实现决定将其显示为0
以实现向后兼容性,但标记它以进行额外诊断。
这对于推广可移植代码实际上是一个值得称道的决定。
虽然很遗憾没有人可以跳进时间机器,只是在标准中使NULL
与nullptr
相同,所以不存在歧义。
要解决该错误,请使用nullptr
而不是NULL
或者更多涉及并且不太好,指向正确类型的指针。
问题是NULL
是一个值为0的宏。模板参数推导推导出NULL
类型为int
(从警告结束可以看出)。 然而, NULL
通常用于指针参数,而不是整数参数。 因此,编译器会警告您将NULL
参数传递给int
参数。 更糟糕的是,这在技术上是错误的,因为不再保证非const整数0参数可以转换为空指针。
正确的解决方案是nullptr
。 正如名称已经提示的那样,这是指针而不是整数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.