C++14中从类对象移出std::tuple元素的代码合法性问询
C++14中从tuple成员多次移动的合法性问题
你希望从类的tuple类型成员变量中移出元素,提供的C++14近最小示例代码可被Clang和GCC编译器接受,但对通过moveBs<Js_>()多次从对象a中移动的操作合法性存在疑虑。
问题
- 在
&&限定的moveB<>()成员函数中移动m_tuple这类成员是否被允许? - 在
moveBs<>()的参数包展开中多次调用std::move(*this)是否被允许?
解答
问题1
完全允许。moveB<>()是被&&限定的成员函数,这意味着调用该函数的对象本身是右值(已经被标记为可移动状态)。此时移动成员变量m_tuple完全符合C++的规则:右值对象的成员可以被安全移动,只要你明确——移动完成后,原对象中被移动的成员会处于「合法但未定义」的状态,后续不要再对这些成员进行依赖其原有值的操作即可。
问题2
语法上是允许的,但要注意实际操作的风险。参数包展开中多次调用std::move(*this),本质是多次将当前的右值对象转换为右值引用,这在C++语法层面是合法的。
不过你必须保证,每次调用moveB<>()时,操作的是tuple中不同的元素:如果重复移动同一个tuple元素,第二次移动的对象已经是被移走过的状态,此时的行为是未定义的。只要你的模板参数Js_对应的是tuple中互不重复的索引,这种用法就是安全合法的。
内容的提问来源于stack exchange,提问作者HelpingHand
相关产品推荐
相关产品推荐

