gpt4 book ai didi

c++ - 为什么函数模板不理解 NULL 但可以使用 nullptr?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:13:05 27 4
gpt4 key购买 nike

我有一个函数

int f(std::shared_ptr<MyClass> sptr);

之后,我编写了以下模板,以便能够调用它(和其他一些)函数:

template <typename Func, typename ArgType>
auto call(Func func, ArgType arg) -> decltype(func(arg))
{
return func(arg);
}

当我尝试将此模板与 NULL 一起使用时,为什么在第三行出现错误?

auto r0 = f(0); // OK
auto r1 = call(f, nullptr); // OK
auto r2 = call(f, NULL); // ERROR! WHY??

1>------ Build started: Project: ConsoleApplication1, Configuration: Debug x64 ------
1> main.cpp
1>main.cpp(245): error C2893: Failed to specialize function template 'unknown-type call(Func,Arg)'
1> With the following template arguments:
1> 'Func=int (__cdecl *)(std::shared_ptr<MyClass>)'
1> 'Arg=int'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

最佳答案

线索在这里:

Arg=int

NULL 必须是一个空指针常量,在 C++11 之前,这意味着它必须是一个值为零的整数常量。在您的实现中,它的类型为 int,并且可能是文字 0

所以模板参数被推导为int,它不能转换为shared_ptr,因此错误。

至于其他的:

auto r0 = f(0); // OK

文字 0 可以被视为空指针常量,如果直接传递给函数,则可以转换为 shared_ptr。在 call 中,参数不是文字,而是 int 类型的变量,无法转换。

auto r1 = call(f, nullptr); // OK

nullptr 有自己的类型,可以转换为 shared_ptr

关于c++ - 为什么函数模板不理解 NULL 但可以使用 nullptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28172388/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com