era*_*ran 11 c++ private exception copy-constructor visual-studio-2010
我遇到了一些我不清楚的异常问题.在C++中,当抛出一个对象时,它首先被复制到一个临时对象,然后临时对象被传递给捕获代码.该副本涉及使用对象的类复制构造函数.AFAIK,这意味着如果一个类有一个私有拷贝构造函数,它就不能用作异常.但是,在VS2010中,以下代码编译并运行:
class Except
{
Except(const Except& other) { i = 2; }
public:
int i;
Except() : i(1) {}
};
int main()
{
try
{
Except ex1;
throw ex1; // private copy constructor is invoked
}
catch (Except& ex2)
{
assert(ex2.i == 2); // assert doesn't yell - ex2.i is indeed 2
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这合法吗?
And*_*nck 13
这不合法.标准15.1/5
如果可以在不改变程序含义的情况下消除临时对象的使用,除了执行与使用临时对象(12.2)相关的构造函数和析构函数之外,那么处理程序中的异常可以直接用参数初始化抛出表达式.当抛出的对象是类对象,并且无法访问用于初始化临时副本的复制构造函数时,程序格式错误(即使临时对象可能被消除).类似地,如果该对象的析构函数不可访问,则程序格式错误(即使临时对象可能被消除).
| 归档时间: |
|
| 查看次数: |
455 次 |
| 最近记录: |