c – 临时对象的子对象是否保证在返回时被移动?
#include <string> #include <vector> using namespace std; auto f() { vector<string> coll{ "hello" }; // // Must I use move(coll[0]) ? // return coll[0]; } int main() { auto s = f(); DoSomething(s); } 我知道:如果我只是返回coll,那么coll保证在返回时被移动. 不过,我不确定:coll [0]是否也保证在返回时被移动? 更新: #include <iostream> struct A { A() { std::cout << "constructedn"; } A(const A&) { std::cout << "copy-constructedn"; } A(A&&) { std::cout << "move-constructedn"; } ~A() { std::cout << "destructedn"; } }; struct B { A a; }; A f() { B b; return b.a; } int main() { f(); } gcc 6.2和clang 3.8输出相同:
解决方法
“隐性移动”规则的最干净的表述是目前工作文件的
[class.copy.elision]/3:
b.a和coll [0]都不是id表达式.所以没有隐含的动作.如果你想要一个举动,你必须明确地做. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |