C++ 按常量值返回的目的?

C++ 按常量值返回的目的?,c++,constants,C++,Constants,在这种情况下,const的目的是什么 const Object myFunc(){ return myObject; } 我刚刚开始阅读有效的C++,项目3提倡这一点,谷歌搜索也提出类似的建议,但也有反例。我看不出在这里使用const有多好。假设按值返回是可取的,我看不出有任何理由保护返回的值。给出的示例说明了这可能有帮助的原因,它可以防止对返回值进行意外的布尔类型转换。因此,实际的问题是应该使用explicit关键字防止隐式布尔类型转换 在这里使用const可以防止在没有赋值的情况下

在这种情况下,const的目的是什么

const Object myFunc(){
    return myObject;
}
我刚刚开始阅读有效的C++,项目3提倡这一点,谷歌搜索也提出类似的建议,但也有反例。我看不出在这里使用const有多好。假设按值返回是可取的,我看不出有任何理由保护返回的值。给出的示例说明了这可能有帮助的原因,它可以防止对返回值进行意外的布尔类型转换。因此,实际的问题是应该使用explicit关键字防止隐式布尔类型转换

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

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

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

从函数返回
常量值

这是为了让它对您的代码产生任何影响:

const int foo() {
   return 3;
}

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

尽管:

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

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

从函数返回
常量

这是为了让它对您的代码产生任何影响:

const int foo() {
   return 3;
}

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

尽管:

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


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

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


尽管任何优化器都很可能对其进行优化…

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


尽管任何优化器都很可能对其进行优化…

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

(a + b).expensive();
然而,在C++11时代,强烈建议将值作为非常量返回,以便充分利用右值引用,而右值引用仅在非常量右值上才有意义


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

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

(a + b).expensive();
然而,在C++11时代,强烈建议将值作为非常量返回,以便充分利用右值引用,而右值引用仅在非常量右值上才有意义


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

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

myFunc() = Object(...);

如果
myFunc
通过引用返回,那么这将很好地工作,但是当通过值返回时,几乎肯定是一个bug(并且可能不会被编译器捕获)。当然,在带有右值的C++11中,这种约定没有以前那么有意义,因为不能从中移动常量对象,因此这可能会对性能产生相当大的影响。

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

myFunc() = Object(...);

如果
myFunc
通过引用返回,那么这将很好地工作,但是当通过值返回时,几乎肯定是一个bug(并且可能不会被编译器捕获)。当然,在带有右值的C++11中,这种约定没有以前那么有意义,因为常量对象不能从,因此,这可能会对性能产生相当大的影响。

是的,您可以使用常量对象执行算术运算,因为算术运算符应该是常量,也可以返回常量对象。您可以使用常量对象执行算术运算,因为算术运算符应该是常量,也可以返回常量对象。无需优化,const ness是一种编译时安全机制。您似乎在考虑返回一个常量引用,所以这与此无关。可能这应该通过返回任何sentinel节点指针/迭代器类型的值副本来实现,不需要返回任何类型的引用,除非复制成本很高。如果返回一个值,那么就没有必要/没有必要使
const
,如此循环。没有什么需要优化的,const ness是一种编译时安全机制。似乎您正在考虑返回一个常量引用,所以这不相关。可能这应该通过返回任何sentinel节点指针/迭代器类型的值副本来实现,不需要返回任何类型的引用,除非复制成本很高。如果返回一个值,那么就没有必要把它设为const,所以是一个完整的圆。请注意,第二个示例只会触发内置类型的错误。您能详细说明第一个示例吗?对于我来说,说返回值将是const没有任何意义,但是能够将它赋值为t