使用 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
这对我来说似乎是一个非常好的方法。
根据您的具体需要,您还可以检查您的实现是否具有调试模式,在该模式下检测到来自 nullptr
的 any 字符串的构造,并且中止您的程序。
您可以提供像
这样的重载
void doSomething(std::nullptr_t);
我有一个采用 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
这对我来说似乎是一个非常好的方法。
根据您的具体需要,您还可以检查您的实现是否具有调试模式,在该模式下检测到来自 nullptr
的 any 字符串的构造,并且中止您的程序。
您可以提供像
这样的重载void doSomething(std::nullptr_t);