我想要运行的功能:

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参数调用该函数时,警告消失。

#1楼 票数:4 已采纳

麻烦的是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或者更多涉及并且不太好,指向正确类型的指针。

#2楼 票数:2

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

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

  ask by gsamaras translate from so

未解决问题?本站智能推荐:

1回复

将nullptr参数委托给模板代码中的指针重载

请考虑以下代码: 住在Coliru 如您所见,调用f(nullptr)导致调用泛型f(T) ,而不是指针重载f(T*) 。 这很烦人。 我知道为什么会发生这种情况:因为nullptr的类型是std::nullptr_t ,而通用模板的重载级别更高。 如何以直截了当的方式“
1回复

如何结合std :: bind(),可变参数模板和完美转发?

我想通过第三方函数从另一个方法中调用一个方法; 但两者都使用可变参数模板。 例如: 问题是,我得到一个编译错误: 我尝试使用lambda,但也许 GCC 4.8尚不处理语法。 这是我尝试过的: 我收到以下错误: 据我了解,编译器希望使用int&&am
3回复

std :: forward如何获得正确的参数?

考虑: void g(int&); void g(int&&); template<class T> void f(T&& x) { g(std::forward<T>(x)); } int main() {
1回复

rvalue模板参数隐式用作左值,std :: forwarding工作

关于std::forward使用的这个例子令我感到困惑。 这是我编辑的版本: 输出是 并且有关对template_type_dumper引用的警告显示在第一个实例化中, decltype(u) = int&&和U = int ,对于第二个decltype(u)
3回复

当一个函数接受T &&的参数并传递一个左值时,模板参数T是否应解析为T&? [重复]

这个问题在这里已有答案: 通用引用的语法 2个答案 我试图用C ++完成转发,所以我编写了以下快速而脏的代码来测试它。 当我构建并运行此代码作为控制台应用程序时,我得到答案10,当我期待0。 看来这行: 在PerfectForwarding功能
2回复

std :: forward没有完美的转发?

关于std::forward建议通常仅限于完美转发函数模板参数的规范用例; 一些评论员甚至说这是std::forward的唯一有效用法。 但考虑这样的代码: 在这种情况下,不会出现完美转发的问题:由于这是一个类模板而不是一个函数模板,客户端代码必须明确指定T ,并可以选择是否以及如何
1回复

std :: forward和copy构造函数

我最近开始学习C ++。 我在std :: forward上有一个关于左值引用和右值引用的问题。 根据我的理解,以下代码中的Func(mc)假设由于模板参数推导规则而调用Func(T&t)。 并且应该在函数内部使用消息“复制构造函数”调用MyClass的复制构造函数。 但是,当我运行程序
2回复

转换 T 时完美转发非 T 参数

(这个问题来自这个答案) 我正在尝试调整当前仅传递可变数量参数的蹦床函数。 我想让它把任何参数PyObject* pyob转换为Object{pyob} ,但转发所有其他参数。 所以(void* self, int, PyObject*, float) -> (int, Object,