哪个更好:
bool MyClass::someQuery() const;
const bool MyClass::someQuery() const;
我一直在使用'const bool',因为我确信我记得听到它是“什么样做”(例如比较运营商)但我无法在任何地方找到证据,主要是因为它很难Google和Intellisense没有帮助任何人;)任何人都可以确认吗?
对我来说,返回const值(这不仅仅是关于bools)更有意义;它会阻止临时修改,这几乎总是一个程序员的错误。我只是想要一些东西来支持这一点,所以我可以向同事们推销返回的const值:)
答案 0 :(得分:34)
当const
没有添加任何值但会使代码膨胀并让读者更多地思考时就是这种情况。这const
有什么意义?调用者可以将值复制到一些非const变量中,无论如何都可以随心所欲地做任何事情。
答案 1 :(得分:27)
所以你知道这是对的,你只是在权威之声之后?
防止意外修改临时工具非常有价值。一般来说,你应该尽可能多地声明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
答案 2 :(得分:19)
请注意if((a*b) = c)
无论如何都不会为内置类型进行编译,所以我们是否正在讨论内置类型(您的问题要求bool
)或用户 - 是非常相关的定义的类型。
对于内置类型,根本没有意义,所以不应该使用它。对于用户定义的类型,我在jalf的阵营:如果调用者希望修改返回的对象怎么办?
我不相信if((a*b) = c)
对于返回const用户定义类型是一个很好的论据,因为我不记得上次我看到编译器不是警告这个。
答案 3 :(得分:16)
更具体一点,只有“对象”可以是常量。 C ++标准对“对象”的定义包括左值引用的所有内容(“有名称”)和类类型临时对象。布尔返回值是非类型类型的右值,这就是为什么符合标准的编译器在这种情况下会忽略“const”的原因。正如其他人已经说过的那样,在这种背景下它是无用的。
答案 4 :(得分:14)
当您返回对成员变量的引用时,将其设为const是有意义的。在这里你返回一个副本,因此不需要const。
答案 5 :(得分:7)
const
修饰符仅用于通过引用返回的返回类型<(作为引用const SomeObject&
或通过指针const SomeObject*
),因此调用者将无法通过引用/指针修改对象。原始类型按值返回,这意味着调用者接收对象的副本,而不是对象本身。
因此,const
不适合返回值类型。由于副本不在被调用函数的控制范围内,因此被调用函数不应该向调用者指示它不能被更改。
答案 6 :(得分:2)
完全没关系。因此,共识是仅返回bool
。
无关紧要的原因是你无论如何都不能调用非const成员函数; bool
不是类或结构。
答案 7 :(得分:2)
由于bool将被复制,所以将const设置为不同。另外,你可能会遇到一些问题。
答案 8 :(得分:1)
内容:
返回类型的值 声明的const无法更改。这个 在给出时特别有用 引用一个类的内部,但是 也可以防止更罕见的错误。
答案 9 :(得分:0)
const bool func();
bool f = func();
0个错误,0个警告。除了不必要的代码通胀之外你还有什么成就?
答案 10 :(得分:0)
这是一篇古老的文章,但我认为值得一提的是,自C ++ 11以来,这里有一个潜在的角落案例。然而,正如其他人所说,如果您使用的是C ++ 11 const bool
并且关联,例如,在大多数情况下,使用bool
或decltype
作为返回类型会没有区别。 result_of
,您可以声明一个与某个函数的返回值具有相同类型的变量,因此const
实际上会在这种情况下产生效果。