2016-01-23 144 views
1

我有一个需要参数const std::string&的方法。它通常会这样使用:a.doSomething("some string")但我想检查提供的字符串是不是从nullptr隐式构造的。当使用const std :: string&作为方法参数类型时,处理nullptr const char *的正确方法是什么?

一个例子:

#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),在将它传递给另一个过载时明确构造std::string之前,它将检查arg

+2

注意'“”'不是'nullptr'既不是'null_str',因为它是一个未初始化的指针。 – LogicStuff

+0

处理此问题的正确方法是访问负责的开发人员小组。 – MSalters

回答

0

,但我要检查是否提供的字符串不是隐含从nullptr

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

我应该提供过载doSomething(const char* arg)这将检查ARG

这似乎是一个非常好的办法给我。

根据你想要什么,你也可以检查你的实现是否具有调试模式,其中任何字符串从nullptr被检测到并终止你的程序。

1
if (arg == nullptr) throw; 

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

参见:

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

如果你想检查空的char *指针,然后是你需要一个函数取一个char *:

void doSomething(const char* arg) 

您可以更改无效返回一个结果代码或者引发异常或者其他一些事情。

+0

另一件事:'throw;'用于重新抛出异常,而不是抛出新的异常。它应该是例如'抛出InvalidArgumentException();'。 – stefan

+0

我知道这些事情,只是想让这个例子简短。 – syntagma

0

可以提供过载像

void doSomething(std::nullptr_t); 
+3

要明确,给定'const char * s;','doSomething(s)'永远不会选择该重载,而不管s是否为空指针。 – hvd

相关问题