You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未执行移动操作,Clang为何报错已删除的移动构造函数?

C++11拷贝消除下不同编译器的行为差异疑问

测试代码

#include <iostream>
using namespace std;
class ABC {
public:
    ABC() { cout << "Default constructor ..\n"; }
    ABC(const ABC& a) { cout << "In copy constrcutor ..\n"; }
    ABC(ABC&& aa) = delete;
};
int main(int argc, char* argv[]) {
    ABC b{ABC{}};
    return 0;
}

测试环境

  • Clang:Apple LLVM version 8.1.0 (clang-802.0.42)
  • GCC:5.4.0 (Ubuntu)

编译命令

g++ --std=c++11 -O3 file.cpp(Clang编译使用clang++ --std=c++11 -O3 file.cpp)

现象

  • Clang编译时报错,提示已删除的移动构造函数
  • GCC编译无报错,运行后输出Default constructor ..

疑问

我了解GCC会针对左值和右值初始化做优化,实际不会调用拷贝构造函数来复制临时对象到左值。但为什么Clang的表现和GCC完全不同?是不是有编译器偏离了C++11标准?还是我的操作哪里出错了?

*额外小测试:曾尝试将ABC b{ABC{}};改为ABC b(ABC());,不过这个测试结果和当前问题无关,仅作补充。

补充说明

之前有人将这个问题标记为重复,但实际上并非如此。我明确知晓C++11标准包含拷贝消除(copy elision)规则,但Clang在构造函数这类关键场景下的表现差异让我困惑,我也查阅过拷贝消除的相关标准定义,仍未找到答案。


内容的提问来源于stack exchange,提问作者Pranay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:18:14