未执行移动操作,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
相关产品推荐
相关产品推荐

