经过代码审查后,我们在 try/catch 块中遇到了复制 elison 的问题。阅读本页后: cpp 参考指南,尤其是本段:
处理异常时,如果 catch 子句的参数与抛出的异常对象属于同一类型(忽略顶级 cv 限定),则省略副本,并且 catch 子句的主体直接访问异常对象,如如果被引用捕获
我认为 catch 中参数的复制省略会自动执行,但是其中一位审阅者运行了一个简单的测试,表明编译器没有执行复制省略:
#include <iostream>
class A
{
public:
A(){}
A(const A&){
std::cout<<"COPY CONSTRUCTOR\n";
}
};
int main()
{
try {
throw A{};
} catch(A a) {
throw a;
}
return 0;
}
编译时:
g++ a.cpp -std=c++11 -O3
我得到以下输出
COPY CONSTRUCTOR
COPY CONSTRUCTOR
terminate called after throwing an instance of 'A'
Aborted (core dumped)
我期待一个类似于(抛出异常时只调用一次复制构造函数)的输出:
COPY CONSTRUCTOR
terminate called after throwing an instance of 'A'
Aborted (core dumped)
测试已在 Linux Ubuntu 16.04 下运行 g++ 版本:
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
是测试用例无效还是我对复制省略的理解有误?非常感谢您的帮助