我应该返回bool还是const bool?

Ben*_*ers 21 c++ const return-value

哪个更好:

bool MyClass::someQuery() const;

const bool MyClass::someQuery() const;
Run Code Online (Sandbox Code Playgroud)

我一直在使用'const bool',因为我确信我记得听到它是"什么样做的"(例如比较运营商)但我无法在任何地方找到证据,主要是因为它很难谷歌和Intellisense没有帮助任何人;)任何人都可以确认吗?

对我来说,返回const值(这不仅仅是关于bools)更有意义; 它会阻止临时修改,这几乎总是一个程序员的错误.我只是想要一些东西来支持这一点,所以我可以赞美给我的同事们返回const值:)

sha*_*oth 35

const没有增加任何价值但是使代码膨胀并让读者更多地思考时就是这种情况.这有什么意义const?调用者可以将值复制到一些非const变量中,无论如何都可以随心所欲地执行任何操作.


moo*_*dow 28

所以你知道这是正确的,你只是在权威之声之后?防止意外修改临时工具非常有价值.一般而言,您应尽可能多地声明事物const,它可以保护您免受各种事故的影响,并为优化程序提供有用的提示.

你有Scott Meyers的"Effective C++"副本吗?将它们指向第3项(第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
Run Code Online (Sandbox Code Playgroud)

  • @Ben:它被拒绝了,因为它与你的问题无关.对于bool或其他内置类型,返回const会产生零差异,并且此示例无论如何都不会编译. (11认同)
  • 这跟他的问题无关.他想知道是否有必要制作一个*bool*返回值const.你用一个复杂的非POD类型回答.-1 (10认同)
  • 实际上我确实说过"这不仅仅是关于bools",而且只有他的例子才提到非bool.也许我应该将标题更改为"我应该返回值还是const值?" - 可以在这里更改问题的标题,还是只会让每个人烦恼? (7认同)
  • 不知道为什么这会被拒绝,这正是我正在寻找的答案!谢谢:)不是说我当然放下任何其他答案; 我也问过"哪个更好",所以也欢迎增加复杂性的意见等等. (2认同)
  • @Ben:你的"(这不仅仅是关于bools)"可能已经逃脱了许多读者,而标题是"bool or const bool?" 抓住了每个人的眼睛.FWIW,我试图回答你的问题,将你的小评论考虑在内. (2认同)
  • 如果`int32_t`不是POD,我会感到非常惊讶.例如,这会阻止它被用在"联盟"中.这不是人们所期望的. (2认同)

sbi*_*sbi 19

请注意,if((a*b) = c)无论如何都不会编译内置类型,因此在这里我们是否讨论内置类型(您的问题要求bool)或用户定义类型是非常相关的.

对于内置类型,它根本没有意义,所以不应该使用它.对于用户定义的类型,我在jalf的阵营:如果调用者想要修改返回的对象怎么办?

我不相信if((a*b) = c)返回const用户定义类型是一个很好的论据,因为我不记得上次我看到编译器没有对此发出警告.

  • @Ben:MS调用他们的编译器将temporaries与非const引用绑定为"feature"的能力,实际上是一个bug. (4认同)
  • POD包括简单的结构,如`struct A {int a,b; 用`(a*b)= c`可以正常工作.但我听说过C++ 0x他们谈到让`operator =`只适用于左值,使得这段代码片段无效.我希望他们会这样做,但可能他们会打破太多的代码:( (3认同)

sel*_*tze 16

更具体一点,只有"对象"可以是常量.C++标准对"对象"的定义包括左值引用的所有内容("有名称")和类类型临时对象.布尔返回值是非类型类型的右值,这就是为什么符合标准的编译器在这种情况下会忽略"const"的原因.正如其他人所说的那样,在这种背景下它是无用的.

  • 是.有些人喜欢返回const对象以防止分配.这通常是由一个可能的拼写错误if(get_object()= blah)...如果函数get_object()返回一个const对象(某些类类型),它将无法编译.但我从未认为这是一个大问题.根据C++ 0x,rvalue引用和移动语义返回const对象可能会适得其反并降低性能.C++ 0x为防止rvalue对象的赋值提供了更好的解决方案:ref限定符. (6认同)

Nav*_*een 14

当你返回一个成员变量的引用时,使它成为const是有意义的.在这里你返回一个副本,因此不需要const.


Ton*_*ony 7

所述const改性剂仅用于返回的返回类型以引用(或者作为参考const SomeObject&或通过指针const SomeObject*),因此主叫方将不能够通过参考/指针修改对象.原始类型由value返回,这意味着调用者接收对象的副本,而不是对象本身.

因此,const不适合返回值类型.由于副本不在被调用函数的控制范围内,因此被调用函数不应该向调用者指示它不能被更改.