按值返回常量和非常量

时间:2011-10-22 16:44:18

标签: c++

有这样的代码:

   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

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

3 个答案:

答案 0 :(得分:4)

  

使用这些功能有什么不同吗?

没有。但是,有difference in their type,如果函数返回类类型,则会有difference regarding invoking methods on the return value

答案 1 :(得分:1)

返回int时没有实际区别,主要是因为您使用临时内置类型执行的操作只需要其值。你可以对一个临时的const引用 - 在后一种情况下可能是有效的(如果是不明智的)将该const引用强制转换为非const并通过它修改临时,但是我不能费心去查看临时性内置类型确实是可变的,并且没有任何实际需要做这样的事情。

返回类类型时有区别 - 在第二种情况下,您可以在函数的返回值上调用非const成员函数,而在第一种情况下则不能。例如,给定std::string fun2() { return "hello"; },您可以std::cout << (fun2() += " world\n");std::string s("foo"); std::cout << s; fun2().swap(s); std::cout << "s";。这些技巧是潜在的优化(特别是在C ++ 11移动语义出现之前),如果fun2返回const std::string,它们就不起作用。第二个技巧叫做“交换优化”,它至少告诉你它的使用足以值得命名。

答案 2 :(得分:0)

使用这些功能没有区别。请注意,在优化器面前,您认为复制可能不正确,这可能会在调用站点内联值2。