【发布时间】:2018-01-15 08:20:43
【问题描述】:
在阅读了cppreference 的复制省略之后,我想玩异常和复制省略。 所以我在coliru上用gcc 7.2写了下面的代码
#include <iostream>
class Exception
{
public:
Exception() { std::cout << "constructed\n"; }
Exception(Exception& other) {std::cout << "copy constructed\n";}
Exception(const Exception& other) {std::cout << "copy constructed\n";}
Exception(Exception&& other) {std::cout << "move constructed\n";}
};
void foo()
{
throw Exception();
}
int main()
{
try
{
foo();
}
catch(Exception e )
{
}
}
输出
构造
复制构造
我们可以看到调用了复制构造函数,即使使用 -O2 调用 gcc 也会发生这种情况。 在我看来,这段代码应该有资格根据以下条款复制省略:
处理异常时,如果catch子句的参数是 与异常相同的类型(忽略顶级 cv 限定) 抛出对象,省略副本和 catch 子句的主体 直接访问异常对象,就像被引用捕获一样。
那么为什么要调用复制构造函数呢?为什么复制省略在这种情况下不起作用?
【问题讨论】:
标签: c++ exception copy-constructor