我有一个采用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;
吗?
答案 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);