【发布时间】:2019-10-13 03:51:18
【问题描述】:
Here是我作为参考的文章,最终在this SO answer中提到。
作者举了两个例子:
示例 1:
std::vector<std::string>
sorted(std::vector<std::string> names)
{
std::sort(names);
return names;
}
// names is an lvalue; a copy is required so we don't modify names
std::vector<std::string> sorted_names1 = sorted( names );
// get_names() is an rvalue expression; we can omit the copy!
std::vector<std::string> sorted_names2 = sorted( get_names() );
示例 2:
std::vector<std::string>
sorted2(std::vector<std::string> const& names) // names passed by reference
{
std::vector<std::string> r(names); // and explicitly copied
std::sort(r);
return r;
}
然后说:
虽然 sorted 和 sorted2 乍一看似乎是相同的,但可以 如果编译器确实复制省略,则性能差异很大。甚至 如果 sorted2 的实际参数是右值,则 copy, names, 是一个左值,所以拷贝不能被优化掉。在一个 从某种意义上说,复制省略是分离编译模型的牺牲品: 在 sorted2 的主体中,没有关于是否 函数的实际参数是一个右值;外面,打电话 网站,没有迹象表明该论点的副本将 最终完成。
我的问题很简单: 为什么编译器在第二个示例中不能使用复制省略,而在第一个示例中可以?
如何通过值传递和引用来区分它们? names 在两个实例中都被命名,所以我假设我们也在两个实例中创建了一个左值。
【问题讨论】:
标签: c++ move-semantics rvalue