C++ 为什么不能将抛出异常的.what()方法的输出与字符串进行比较?
由于某种原因比较失败,代码无法打印C++ 为什么不能将抛出异常的.what()方法的输出与字符串进行比较?,c++,string,pointers,string-comparison,C++,String,Pointers,String Comparison,由于某种原因比较失败,代码无法打印True。我不知道它是什么,但如果我将e.what()=“这里发生了不好的事情”更改为e.what()==std::string(“这里发生了不好的事情”) #包括 #包括 #包括 int main(){ 尝试 { 抛出std::runtime_错误(“这里发生了不好的事情”); } 捕获(标准::异常常量和e) { 如果(例如,what()=“这里发生了不好的事情”){ std::cout因为返回一个常量字符*,而字符串文本“是一个常量字符[N]。运算符=对它
True
。我不知道它是什么,但如果我将e.what()=“这里发生了不好的事情”
更改为e.what()==std::string(“这里发生了不好的事情”)
#包括
#包括
#包括
int main(){
尝试
{
抛出std::runtime_错误(“这里发生了不好的事情”);
}
捕获(标准::异常常量和e)
{
如果(例如,what()=“这里发生了不好的事情”){
std::cout因为返回一个常量字符*
,而字符串文本“
是一个常量字符[N]
。运算符=
对它们进行两个指针的比较。必须对它们使用strcmp()
if (strcmp(e.what(), "Something Bad happened here") == 0) // ...
std::string
OTOH有一个操作符==
to
如果您有C++14,那么您可以使用
但是当然,在比较之前仍然需要构造std::string
,这比strcmp
在C++17中有一个std::string\u视图
,它构造起来要便宜得多,所以您可以使用它
using namespace std::literals::string_view_literals;
if (e.what() == "Something Bad happened here"sv) // ...
因为返回一个常量字符*
,而字符串文本“
是一个常量字符[N]
。运算符=
对它们进行两个指针的比较。必须对它们使用strcmp()
if (strcmp(e.what(), "Something Bad happened here") == 0) // ...
std::string
OTOH有一个操作符==
to
如果您有C++14,那么您可以使用
但是当然,在比较之前仍然需要构造std::string
,这比strcmp
在C++17中有一个std::string\u视图
,它构造起来要便宜得多,所以您可以使用它
using namespace std::literals::string_view_literals;
if (e.what() == "Something Bad happened here"sv) // ...
what()sv
@HolyBlackCat是的,我确实看过std::string\u view
,但我误读了它,所以我认为你不能在std::string\u view
和const char*
上做std::string\u view(e.what())=“foo”
或e.what()=“foo”sv
@HolyBlackCat是的,我确实看过std::string\u视图
,但我看错了,所以我认为你不能在std::string\u视图
和const char*