关于c ++:通过const值返回的目的?

Purpose of returning by const value?

本问题已经有最佳答案,请猛点这里访问。

警察的目的是什么?

1
2
3
const Object myFunc(){
    return myObject;
}

我刚刚开始阅读有效的C++,项目3提倡这一点,谷歌搜索也提出类似的建议,但也有反例。我不知道在这里使用const会有多好。假设按值返回是可取的,我看不到任何理由来保护返回值。给出了为什么这可能有用的示例,以防止返回值的意外bool强制转换。因此,实际的问题是,应该使用explicit关键字来防止隐式bool强制转换。

在此处使用const可防止在未赋值的情况下使用临时对象。所以我不能用这些对象执行算术表达式。似乎从来没有一个不知名的警察有用的案例。

在这里使用const有什么好处?什么时候更可取?

编辑:将算术示例更改为修改可能要在赋值之前执行的对象的任何函数。


在假设的情况下,您可以对一个对象执行一个可能昂贵的非常量操作,按常量值返回可以防止您意外地对临时对象调用此操作。假设+返回一个非常量值,您可以写:

1
(a + b).expensive();

然而,在C++ 11的时代,强烈建议将值作为非const返回,这样就可以充分利用rValk引用,这在非常量rValo上是有意义的。

总之,这种做法是有道理的,但实际上已经过时了。


从函数返回const值是没有意义的。

很难让它对您的代码产生任何影响:

1
2
3
4
5
6
7
8
const int foo() {
   return 3;
}

int main() {
   int x = foo();  // copies happily
   x = 4;
}

以及:

1
2
3
4
5
6
7
8
9
const int foo() {
   return 3;
}

int main() {
   foo() = 4;  // not valid anyway for built-in types
}

// error: lvalue required as left operand of assignment

尽管您可以注意到返回类型是否为用户定义的类型:

1
2
3
4
5
6
7
8
9
10
11
struct T {};

const T foo() {
   return T();
}

int main() {
   foo() = T();
}

// error: passing ‘const T’ as ‘this’ argument of ‘T& T::operator=(const T&)’ discards qualifiers

这是否对任何人都有好处是值得怀疑的。

返回一个引用是不同的,但是除非Object是某个模板参数,否则不会这样做。


它确保返回的对象(此时为右值)不能被修改。这确保用户不能这样认为:

1
myFunc() = Object(...);

如果引用返回myFunc,这会很好地工作,但是当按值返回时,几乎可以肯定是一个bug(并且可能不会被编译器捕获)。当然,在C++ 11中使用它的值,这个约定不像以前那样有意义,因为const对象不能被移动,所以这对性能有相当大的影响。


myObject可以是指针。"const"用于保护myObject指向的值。


它可以用作返回对私有常量数据类型的引用的包装函数。例如,在一个链接列表中,您有常数tail和head,如果您想确定一个节点是tail还是head节点,那么您可以将它与该函数返回的值进行比较。

尽管任何优化器都很可能优化它…