【问题标题】:Why does string not work here while char const* does?为什么字符串在这里不起作用,而 char const* 起作用?
【发布时间】:2021-04-19 17:19:59
【问题描述】:

为什么当我发现错误而 char const* 可以时,字符串在这里不起作用?两者有什么区别?

try {
    throw "connection fail";

} catch( string e ) {
    if(e == "connection fail") {
        std::cout << "caught: " << e << std::endl;
    }
}

【问题讨论】:

  • 你没有扔std::string,所以你抓不到。
  • @tkausl 为什么不是字符串?
  • 这里不确定,但我怀疑问题是“为什么catch 不遵循与函数参数相同的转换规则?”
  • 听起来你可以使用good C++ bookstring-literalconst char[N],而不是 std::string
  • throw "xxxx"s; - 在这里阅读更多en.cppreference.com/w/cpp/string/basic_string/operator%22%22s

标签: c++ c++11 exception


【解决方案1】:

你没有扔一个 std::string,所以你抓不到一个。

为什么不是字符串?

因为在 C++ 中,错误命名的字符串字面量("abc" 就是这样)不是字符串。字符串字面量为字符串的内容分配一些静态存储,并评估为const char (&amp;)[N] 类型,即对给定固定长度的字符数组的引用。在大多数情况下,该引用衰减到 const char *,它是一个指向 const char 的指针,并且在对术语“字符串”的任何合理解释中都与字符串无关。这是 C 的不幸遗留问题,其中也没有字符串,并且您通过将指针传递给字符串的第一个字符来传递“字符串”,并隐含假设字符串必须是 '\0'-terminated 和当然不能包含 NUL ('\0'),因为它们与终结符无法区分。

要创建字符串,您必须明确说明:throw std::string("foo bar baz");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-04
    • 2012-11-30
    • 2013-05-16
    • 2019-02-10
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多