可以抛出具有私有拷贝构造函数的对象吗?

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)相关的构造函数和析构函数之外,那么处理程序中的异常可以直接用参数初始化抛出表达式.当抛出的对象是类对象,并且无法访问用于初始化临时副本的复制构造函数时,程序格式错误(即使临时对象可能被消除).类似地,如果该对象的析构函数不可访问,则程序格式错误(即使临时对象可能被消除).