代码之家  ›  专栏  ›  技术社区  ›  Matt Joiner

为什么C++ STD::异常::什么成员const?

  •  4
  • Matt Joiner  · 技术社区  · 14 年前

    我很好奇为什么 std::exception::what 成员函数是 const ?

    class exception 
    {
    public:
      exception() throw() { }
      virtual ~exception() throw();
    
      /** Returns a C-style character string describing the general cause
       *  of the current error.  */
      virtual const char* what() const throw();
    };
    
    4 回复  |  直到 14 年前
        1
  •  17
  •   James McNellis    14 年前

    打电话给 what() 成员函数不应修改 exception 反对。

    通常,异常由const引用捕获。例如,

    try {
        // ...
    }
    catch (const std::exception& ex) {
        std::cout << ex.what();
    }
    

    如果 什么() 成员函数不是const限定的,此模式将无法工作,因为您将无法从catch块中调用它。

    如果不想生成要从中返回的字符串 什么() 在调用之前,可以将字符串具体化为可变成员变量。

        2
  •  4
  •   SLaks    14 年前

    因为它不会变异 Exception 实例。

    一般来说,所有不改变类实例的函数都应该声明 const ,以便可以调用它们 常量 -限定变量。

        3
  •  3
  •   Jeff Dege    14 年前

    把问题翻过来。为什么不是康斯特?

    如果是“char*what()const”,则可以修改what()返回指针的内部char数组。如果exception()允许任意代码以这种方式操作其内部缓冲区,那么what()将返回一个常量char*,而不是char*,这将是非常愚蠢的。

    如果是“const char*what()”,没有const限定符,则表示调用what()将修改异常的内部状态。但这不是你所期望的。

    所以我们得到了“const char*what()const”。返回指向常量数组的指针的常量函数。结果就是你可以用常量引用调用它。通常有哪些例外。

    毕竟,通常不更改异常,而是构造异常,抛出异常,然后让处理代码在不更改异常的情况下操作它们。因此,它们的成员函数应该是常量。

        4
  •  2
  •   Brent Arias    14 年前

    理由可能来自维护稳定的愿望。例如,如果进程内存不足,则可能引发异常。如果是这样的话,修改“What”可能会适得其反,从而需要更多的空间。如果程序员试图这样做,在这种情况下,它会立即中止整个程序。可能不是你想要的。

    同样,不适合使用堆栈中的额外空间,因为这正是抛出异常期间正在uwinding的内容。

    也就是说,boost库有一个boost::异常 允许您在异常向上推进时向其添加材料。警告清空器。