2016-01-23 147 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

相關問題