Copy Elision无法执行时的行为:移动/拷贝构造调用规则确认
关于Copy Elision失效后的移动/拷贝行为疑问
我已充分理解*Copy Elision(拷贝消除)*机制,但不清楚当Copy Elision无法执行时的行为:此时若存在移动构造函数或移动赋值运算符,是否会被保证调用?是否存在移动不可行而退回到拷贝构造或赋值的场景?
代码示例
class X { // 一个拷贝成本很高的类 // 移动构造函数 X(X&& other) { //... } // 移动赋值运算符 X& operator=(X&& other) { //... return *this; } //... } // 大多数编译器无法执行拷贝消除 X test(int i) { X n1; X n2; if (i > 0) { return n1; } else { return n2; } } // 以下代码会发生什么? int main() { // 是否会保证调用移动构造? X x1 = test(-1); X x2; // 是否会保证调用移动赋值? x2 = test(10); return 0; }
我的理解
- 编译器首先尝试执行拷贝消除和移动消除;
- 若无法消除,则尝试调用可用的移动构造函数或移动赋值运算符;
- 仅当移动构造或赋值不可用时,才退回到拷贝操作。
请问上述理解是否准确?希望能得到权威结论的验证。
内容的提问来源于stack exchange,提问作者RajV
相关产品推荐
相关产品推荐

