下面的 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/