有这样的代码:
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
使用这些功能有什么不同吗?它们都按值返回,因此它总是在函数调用结束时复制。
答案 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。