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

时间:2016-01-23 12:10:32

标签: c++ string null nullptr

我有一个采用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并将其传递给另一个重载时检查var stage; var background;吗?

3 个答案:

答案 0 :(得分:1)

if (arg == nullptr) throw; 

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

请参阅:

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

如果你想检查一个null char *指针,那么你需要一个带char *的函数:

 void doSomething(const char* arg)

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

答案 1 :(得分:0)

  

但是我想检查提供的字符串是否不是从nullptr

隐式构造的

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

  

我应该提供一个可以检查arg的重载doSomething(const char* arg)

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

根据您的具体需要,您还可以检查您的实现是否具有调试模式,其中检测到来自nullptr任何字符串的构造并中止您的程序。< / p>

答案 2 :(得分:0)

您可以提供类似

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