我正在处理一个相当统一的供应商提供的 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);
当在包装器中使用时,为什么它(对于某些编译器)是一个问题?
NULL
只是整数文字 #define
的 0
。 您可以直接将文字 0
分配给指针,但如果不显式转换,则无法将值为 int
的 0
分配给指针。 由于您将 NULL
传递给模板参数,因此它被推导为 int
而不是 char*
。 因此,您必须使用 (char*)NULL
或 nullptr
。