使用 const std::string& 作为方法参数类型时,处理 nullptr const char* 的正确方法是什么?

What is the correct way to handle nullptr const char* when using const std::string& as method argument type?

我有一个采用 const std::string& 参数的方法。它通常会像这样使用:a.doSomething("some string") 但我想检查提供的字符串是否不是从 nullptr 隐式构造的。

一个例子:

#include <string>

struct A {
    void doSomething(const std::string& arg) {
        // if (arg == nullptr) throw; // This is what I want (doesn't work)
        if(arg.empty()) // This does not detect nullptr
            throw;
    }
};

int main(int argc, char* argv[]) {
    const char* null_str;
    std::string s("");
    A a;
    a.doSomething(null_str);
    a.doSomething(s);

    return 0;
}

执行此操作的正确、优雅的方法是什么?我是否应该提供一个重载 doSomething(const char* arg) 来检查 arg,然后再从它显式构造 std::string 并将它传递给另一个重载?

if (arg == nullptr) throw; 

不起作用,因为 arg 永远不能为空。您传递对 arg 的引用,并且引用永远不能为空。所以不需要检查null。您可以简单地删除空检查,因为它不合适。

参见:

https://isocpp.org/wiki/faq/references#refs-not-null

如果你想检查空 char* 指针,那么是的,你需要一个接受 char* 的函数:

 void doSomething(const char* arg)

您可以将 void 更改为 return 结果代码或引发异常或其他事情。

but I want to check whether string supplied was not implicitly constructed from a nullptr

从空指针构造字符串具有未定义的行为。您需要在 尝试构建这样的字符串之前 检测到它。这意味着您不能在被调用的函数内部检查它:构造字符串的是调用者。

Should I provide an overload doSomething(const char* arg) which would check arg

这对我来说似乎是一个非常好的方法。

根据您的具体需要,您还可以检查您的实现是否具有调试模式,在该模式下检测到来自 nullptrany 字符串的构造,并且中止您的程序。

您可以提供像

这样的重载
void doSomething(std::nullptr_t);