- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
下面的 std::move
是多余的吗?
std::string member;
obj(std::initializer_list<std::string> p_list)
: member {std::move(join(p_list))}
{}
这是连接函数:
std::string join(string_initializer_list p_list) {
size_t size {};
for (auto const & s : p_list) {
size += s.size();
}
std::string output;
output.reserve(size);
for (auto const & s : p_list) {
output.append(s);
}
return output;
}
最佳答案
不,你不需要std::move
。 std::move
的功能是将任何值转换为右值。您的函数已经返回一个右值,因此就将结果绑定(bind)到引用而言,强制转换没有任何效果(这是您从右值初始化 member
所追求的)。
事实上,主动使用std::move
抑制复制省略,所以它是一个严格的悲观化:
std::string s = join({}); // construct from prvalue, elidable,
// elision mandatory in C++17
std::string s = std::move(join({})); // temporary object must be constructed,
// s is initialized by moving from the
// temporary
第一种形式std::string s = join({});
,copy elision是指直接构造join
的返回对象代替s
(没有构造临时对象,只做copy或move),而且函数体中的output
变量也被省略,直接在返回值中构造,即在 s
中。对于 std::move
,第一个省略步骤不可用。
关于c++ - 下面的 std::move 是多余的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40900883/
我的服务层有如下方法 public ModuleResponse GetModules(ModuleRequest request) { var response = new ModuleRe
我构建的工具栏与大多数工具栏一样,minHeight 设置为 actionBarSize: 但是,如果我删除这个属性,就完全没有区别了。工具栏保持其 actionBarSize,即使我删除菜单并将
我已经为 SVG 和剪辑路径苦苦挣扎了一段时间。 我正在尝试创建一个三 Angular 形剪辑路径,它将覆盖照片以给顶部一个“三 Angular 形”边缘。 我试图实现与照片完全相同的效果,但三 An
我有一个带有 2 个索引的 PostgreSQL 表。其中一个索引涵盖了 website_id 和 tweet_id 列,是一个唯一的 B 树索引。第二个索引只覆盖 website_id 列,是一个非
我是一名优秀的程序员,十分优秀!