警告:将 NULL 传递给 'std::thread::thread
warning: passing NULL to non-pointer argument of ‘std::thread::thread
我想运行的函数:
struct foo;
void bar(const foo* p = 0);
我如何调用函数:
auto thread = std::thread(&bar, NULL);
警告:
foobar.h:223:9: 警告:将 NULL 传递给 'std::thread::thread(_Callable&&, _Args&& ...) 的非指针参数 2 [_Callable = void (*)(const foo*), _Args = {int}]' [-Wconversion-null]
我在这里错过了什么?
当我使用非NULL
参数调用函数时,警告消失了。
问题是NULL
有点模棱两可。
虽然它在语义上是一个指针,但它可以(在你的实现中是)整数类型。
18.2
[support.types]
类型3 宏
NULL
是本国际标准 (4.10) 中实现定义的 C++ null 指针常量。
4.10 指针转换
[conv.ptr]
1 空指针常量是值为零或 prvalue 为
std::nullptr_t
的整数文本 (2.14.2)。
[...]
因此,您的实现决定将其简单0
向后兼容,但将其标记为额外的诊断。
对于推广可移植代码来说,这实际上是一个值得称赞的决定。
虽然很遗憾没有人可以跳进时间机器,只是让NULL
与标准中的nullptr
相同,所以歧义不存在。
若要解决此错误,请使用 nullptr
而不是 NULL
或者,使用更复杂且不太好的指针,正确类型的指针。
问题是NULL
是一个值为 0 的宏。模板参数推导推断出NULL
的类型int
(从警告的末尾可以看到)。然而,按照惯例,NULL
用于指针参数,而不是积分参数。因此,编译器会警告您正在将NULL
参数传递给int
参数。更糟糕的是,这在技术上是错误的,因为非常量整数 0 参数不再保证可转换为空指针。
正确的解决方案是 nullptr
.顾名思义,这是一个指针而不是整数。
- 在std::thread中,joinable()然后join()线程安全吗
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 分离一个静态常量 std::thread?
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 如何从 std::thread 返回值
- 将 std::thread by 值推送到列表中
- 转发变量参数列表以模拟 std::thread
- 嵌入式设备 -> std::thread -> FreeRTOS?
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- std::thread 增加 DLL 引用计数,从而防止卸载 DLL
- 如何防止 std::thread 在 QT 中冻结 GUI?
- 对带有唯一指针的 std::thread 使用类成员函数时出现编译错误
- 为什么参数在构造 std::thread 时移动两次
- std::thread::_Invoker 使用线程编程时出错
- 在线程 A 中创建一个 std::thread 对象,在线程 B 中连接
- 为什么编译器抱怨 std::thread 参数在转换为右值后必须是可调用的?
- 将模板(没有规范)传递给 std::thread() 会出现错误:<未解析的重载函数类型>匹配错误
- 使用 std::thread & std::bind 在成员函数中启动线程
- 从gcc 5.4升级至gcc 6.3 std::thread std:ref issue