通过 const 值返回基本类型有意义吗?

问题描述 投票:0回答:11

哪个更好:

bool MyClass::someQuery() const;

const bool MyClass::someQuery() const;

我一直在使用

const bool
,因为我确信我记得听说过它是“
int
的作用”(例如比较运算符),但我在任何地方都找不到这方面的证据,主要是因为它很困难Google 和 IntelliSense 没有提供任何帮助;)任何人都可以证实这一点吗?

对我来说,返回

const
值(这不仅仅是关于
bool
)更有意义;它将防止临时变量被修改,这几乎总是程序员的错误。我只是想要一些东西来支持这一点,这样我就可以向我的同事们颂扬返回
const
的价值观:)

c++ constants return-value
11个回答
38
投票

这种情况就是

const
没有增加任何价值,而是夸大了代码并使读者思考更多。这有什么意义
const
?调用者可以将值复制到某个非常量变量中,然后用它做任何他想做的事情。


36
投票

所以你知道这是对的,你只是在追求权威之声? 防止临时变量的意外修改非常有价值。一般来说,你应该声明尽可能多的东西

const
,它可以保护你免受各种事故的影响,并为优化器提供有用的提示。

您有 Scott Meyers 的《Effective 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

21
投票

请注意,无论如何,

if((a*b) = c)
都不会编译内置类型,因此无论我们谈论内置类型(您的问题要求
bool
)还是用户定义类型,这里都非常相关。

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

我不相信

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


20
投票

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


15
投票

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


9
投票

const
修饰符仅用于通过引用返回的返回类型(作为引用const SomeObject&
或通过指针
const SomeObject*
),因此调用者将无法通过引用修改对象/指针。原始类型是
按值返回的,这意味着调用者收到的是对象的副本,而不是对象本身。

因此,

const

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


3
投票
这是一篇古老的文章,但我认为值得一提的是,自 C++11 以来,这里存在一个潜在的极端情况。然而,正如其他人所述,在大多数情况下,如果您使用 C++11

const bool

 和关联函数,例如使用 
bool
decltype
 作为返回类型,都没有什么区别。 
result_of
,您可以声明一个与某个函数的返回值具有相同类型的变量,因此 
const
 在这种情况下实际上会产生效果。


2
投票
完全没关系。因此,共识是只返回

bool

无所谓的原因是无论如何你都不能调用非常量成员函数;

bool

 不是类或结构。


2
投票
因为bool要被复制,所以无论是否放入const都是一样的。另外,您可能会遇到一些编译问题。


1
投票

常量返回类型

总结:

返回类型的值是 声明的 const 不能更改。这 当给予 引用类的内部,但是 还可以防止更罕见的错误。


1
投票
const bool func(); bool f = func();

0 个错误,0 个警告。除了不必要的代码膨胀之外,您还完成了什么?

© www.soinside.com 2019 - 2024. All rights reserved.