按值返回常量和非常量

Return constant and non constant by value

本文关键字:常量 非常 返回      更新时间:2023-10-16

有这样的代码:

   const int fun(){ return 2; } // can be assigned to int and const int
   int fun2(){ return 2; } // can be assigned to int and const int

使用这些函数有什么区别吗?它们都按值返回,因此总是在函数调用结束时复制。

使用这些函数有什么区别吗?

。但是,它们的类型是不同的,如果函数返回一个类类型,那么在调用返回值的方法方面就会有所不同。

返回int时没有实际区别,基本上是因为您对内置类型的临时对象所做的任何操作只需要它的值。您可以将const引用转换为临时对象——在后一种情况下,将const引用转换为非const并通过它修改临时对象可能是有效的(如果不明智的话),但我不想费心去查找内置类型的临时对象是否真的是可变的,并且没有任何实际需要这样做。

当返回一个类类型时,有一个区别——在第二种情况下,你可以在函数的返回值上调用非const成员函数,而在第一种情况下,你不能。例如,已知std::string fun2() { return "hello"; },你可以做std::cout << (fun2() += " worldn");,或std::string s("foo"); std::cout << s; fun2().swap(s); std::cout << "s";。这些技巧是潜在的优化(特别是在c++ 11移动语义出现之前),如果fun2返回const std::string,它们就不起作用了。第二个技巧被称为"swaptimization",它至少告诉您它的使用足够值得命名。

使用这些函数没有区别。请注意,在优化器面前,复制发生的假设可能不正确,优化器可能会在调用位置内联值2。