通过 const&、&& 或仅通过值,哪个更好地获取 return 值?
Which is better to get return value, by const&, by &&, or just by value?
#include <vector>
std::vector<int> f()
{
return std::vector<int>(1024);
}
void use_1(std::vector<int> const&)
{}
void use_2(std::vector<int> const&)
{}
int main()
{
{
auto const& v = f(); // style 1
use_1(v);
use_2(v);
}
{
auto&& v = f(); // style 2
use_1(v);
use_2(v);
}
{
auto v = f(); // style 3
use_1(v);
use_2(v);
}
}
哪个更好? 样式 1、样式 2 或 样式 3?
在我看来,如果 return 类型没有实现移动语义,那么 style 1 和 style 2 比 样式 3.
更有效
按值计算不会出错,而且效率也不会降低。一生清明,永不悬垂。参考版本容易出错。举个例子:
#include <utility>
struct Bar {};
template <class T>
auto&& foo(T&& t) {
return std::forward<T>(t);
}
int main() {
auto&& bar = foo(Bar{});
// bar dangles
}
您可能认为“这永远不会发生”,但随着代码库变得越来越复杂,它确实发生了。保持简单。
#include <vector>
std::vector<int> f()
{
return std::vector<int>(1024);
}
void use_1(std::vector<int> const&)
{}
void use_2(std::vector<int> const&)
{}
int main()
{
{
auto const& v = f(); // style 1
use_1(v);
use_2(v);
}
{
auto&& v = f(); // style 2
use_1(v);
use_2(v);
}
{
auto v = f(); // style 3
use_1(v);
use_2(v);
}
}
哪个更好? 样式 1、样式 2 或 样式 3?
在我看来,如果 return 类型没有实现移动语义,那么 style 1 和 style 2 比 样式 3.
更有效按值计算不会出错,而且效率也不会降低。一生清明,永不悬垂。参考版本容易出错。举个例子:
#include <utility>
struct Bar {};
template <class T>
auto&& foo(T&& t) {
return std::forward<T>(t);
}
int main() {
auto&& bar = foo(Bar{});
// bar dangles
}
您可能认为“这永远不会发生”,但随着代码库变得越来越复杂,它确实发生了。保持简单。