通过常量值返回的目的?

这个常量的目的是什么?

const Object myFunc(){
return myObject;
}

我刚刚开始阅读《有效的 C + + 》 ,第三条提倡这一点,谷歌搜索引擎也搜到了类似的建议,但也有反例。我看不出在这里使用 const 有什么好处。假设按价值计算的返回值是可取的,我看不出有任何理由保护返回值。为什么这可能有帮助的例子是防止返回值的意外 bool 强制转换。那么实际的问题是,应该使用显式关键字来防止隐式 bool 强制转换。

在这里使用 const 可以防止在没有赋值的情况下使用临时对象。所以我无法对这些对象执行算术表达式。似乎没有一个未命名的 const 是有用的。

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

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

159690 次浏览

从一个函数返回一个 const值是非常漂亮的 毫无意义

很难可以让它对你的代码产生任何影响:

const int foo() {
return 3;
}


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

:

const int foo() {
return 3;
}


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


// error: lvalue required as left operand of assignment

虽然 您可以注意到返回类型是否是用户定义的类型:

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是某个模板参数,否则不能这样做。

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

尽管任何优化器都可能优化它..。

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

(a + b).expensive();

但是,在 C + + 11时代,强烈建议将值作为非常量返回,以便充分利用 rvalue 引用,这只在非常量 rvalue 上有意义。

总之,为这种做法提供了一个理论基础,但是它本质上已经过时了。

它确保不能修改返回的对象(此时为 RValue)。这样可以确保用户不会这样想:

myFunc() = Object(...);

如果 myFunc通过引用返回,那么这种方法会很好地工作,但是当通过值返回时,几乎可以肯定是一个 bug (编译器可能不会捕捉到)。当然,在 C + + 11中使用 rvalue 时,这个约定不像之前那样有意义,因为 const 对象不能从中移动,所以这会对性能产生相当大的影响。