代码之家  ›  专栏  ›  技术社区  ›  Ben Hymers

我应该返回布尔还是常量布尔?

  •  21
  • Ben Hymers  · 技术社区  · 16 年前

    bool MyClass::someQuery() const;
    
    const bool MyClass::someQuery() const;
    

    我一直在使用“const bool”,因为我记得我听说过它是“ints做什么的”(例如,比较运算符),但我在任何地方都找不到这方面的证据,主要是因为谷歌很难做到这一点,Intellisense也帮不上忙;)有人能证实吗?

    对我来说,返回常量值(这不仅仅是布尔值)更有意义;它将防止临时表被修改,这几乎总是程序员的错误。我只是想要一些东西来支持这一点,这样我就可以向我的同事赞美返回的常量值:)

    11 回复  |  直到 16 年前
        1
  •  39
  •   sharptooth    16 年前

    这种情况发生在 const 没有增加任何价值,但会使代码膨胀,让读者思考得更多。这有什么意义

        2
  •  34
  •   moonshadow    16 年前

    所以你知道这是对的,你只是在追求权威的声音? 防止临时表的意外修改是非常有价值的。一般来说,您应该尽可能多地声明内容 const ,它可以保护您免受各种事故的影响,并为乐观主义者提供有用的提示。

    你有Scott Meyers的“高效C++”吗?将其指向第3项(第三版第18页);)

    它给出了

    class Rational {...};
    const Rational operator* (const Rational& lhs, const Rational& rhs );
    
    if( (a * b) = c ) // declaring operator *'s return value const causes error to be caught by compiler
    
        3
  •  21
  •   Community Mohan Dere    8 年前

    注意 if((a*b) = c) 无论如何都不会为内置类型编译,因此无论我们谈论的是内置类型(您的问题要求 bool )或用户定义的类型。

    欲望 要修改返回的对象?

    如果((a*b)=c) 对此提出警告。

        4
  •  20
  •   sellibitze    16 年前

    更具体地说,只有“对象”可以是常量。C++标准的“对象”定义包括LValk(“有名称”)和类类型临时性的所有内容。布尔返回值是非类类型的右值,这就是为什么符合标准的编译器在这种情况下会忽略“const”。正如其他人已经说过的,在这种情况下它是无用的。

        5
  •  15
  •   Naveen    16 年前

    当您返回对成员变量的引用时,将其设置为常量是有意义的。在这里,您将返回一份副本,因此不需要const。

        6
  •  9
  •   Tony the Pony    16 年前

    这个 const 参照 (作为参考) const SomeObject& 或者通过指针 const SomeObject* ),因此调用方将无法通过引用/指针修改对象。返回基本类型 复制

    所以,, 常数

        7
  •  2
  •   MSalters    16 年前

    这完全没关系。因此,共识是回归公正 bool .

    这不重要的原因是,您无论如何都不能调用非常量成员函数; 布尔 不是类或结构。

        8
  •  2
  •   user175491    16 年前

        9
  •  2
  •   javidcf    8 年前

    这是一篇古老的文章,但我认为值得一提的是,自C++11以来,这里有一个潜在的转折点。然而,正如其他人所说,你是否使用 const bool bool 在大多数情况下,如果您使用的是C++11,则返回类型为 decltype 和同事,例如。 result_of ,可以声明与某个函数的返回值类型相同的变量,因此 const 在这种情况下会产生影响。

        10
  •  1
  •   KV Prajapati    16 年前

    const return type

    返回类型的值 无法更改声明的常量。这 对类内部的引用,但是 还可以防止更罕见的错误。

        11
  •  1
  •   Chris Becke    16 年前
    const bool func();
    bool f = func();
    

    0个错误,0个警告。除了不必要的代码膨胀,您还完成了哪些工作?