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)
sbi*_*sbi 19
请注意,if((a*b) = c)无论如何都不会编译内置类型,因此在这里我们是否讨论内置类型(您的问题要求bool)或用户定义类型是非常相关的.
对于内置类型,它根本没有意义,所以不应该使用它.对于用户定义的类型,我在jalf的阵营:如果调用者想要修改返回的对象怎么办?
我不相信if((a*b) = c)返回const用户定义类型是一个很好的论据,因为我不记得上次我看到编译器没有对此发出警告.
sel*_*tze 16
更具体一点,只有"对象"可以是常量.C++标准对"对象"的定义包括左值引用的所有内容("有名称")和类类型临时对象.布尔返回值是非类型类型的右值,这就是为什么符合标准的编译器在这种情况下会忽略"const"的原因.正如其他人所说的那样,在这种背景下它是无用的.
所述const改性剂仅用于返回的返回类型以引用(或者作为参考const SomeObject&或通过指针const SomeObject*),因此主叫方将不能够通过参考/指针修改对象.原始类型由value返回,这意味着调用者接收对象的副本,而不是对象本身.
因此,const不适合返回值类型.由于副本不在被调用函数的控制范围内,因此被调用函数不应该向调用者指示它不能被更改.