NULL 与 nullptr

问题描述 投票:0回答:1

我正在处理一个相当统一的供应商提供的 API,并且也希望以统一的方式检查和处理任何故障。为此,我编写了以下包装:

    template <typename Func, typename... Args>
    auto awrap(Func &func, Args&&... args)
    {
        auto code = func(args...);

        if (code >= 0)
            return code;

        ... handle the error ...

    };
...
    awrap(handlepath, handle, path, NULL, 0, coll, NULL);

上面的代码用 clang 编译得很好,但是 g++13 —— 和 Microsoft VC++ —— 都抱怨两个 NULL 参数:

... error: invalid conversion from 'int' to 'const char*' [-fpermissive]
   87 |                 auto code = func(args...

NULL
替换两个
nullptr
可以解决问题,但是为什么这很重要呢?很可能,预处理器将
NULL
变成
0x0
甚至
0
,但最初的调用从未引起“注意”。使用 NULL 非常适合:

    handlepath(handle, path, NULL, 0, coll, NULL);

当在包装器中使用时,为什么它(对于某些编译器)是一个问题?

c++ templates c++17
1个回答
0
投票

NULL
只是整数文字
#define
0
。 您可以直接将文字
0
分配给指针,但如果不显式转换,则无法将值为
int
0
分配给指针。 由于您将
NULL
传递给模板参数,因此它被推导为
int
而不是
char*
。 因此,您必须使用
(char*)NULL
nullptr

© www.soinside.com 2019 - 2024. All rights reserved.