私人拷贝构造函数对象可以被抛出?(Can objects with private copy con

2019-06-23 13:05发布

我已经遇到了一些例外的问题是我不清楚。 在C ++中,当对象被抛出它首先复制到一个临时对象,然后临时对象被传递给捕捉代码。 副本涉及使用对象的类拷贝构造函数。 据我所知,这意味着如果一个类有一个私有的拷贝构造函数,它不能被用来作为一个例外。 然而,在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;
}

这是合法的吗?

Answer 1:

这是不合法的。 标准15.1 / 5

如果使用的临时对象的能够在不改变程序的意义,除了构造和析构与使用的临时对象(12.2)的相关联的执行被消除,然后在处理程序中的异常可以被直接与参数初始化的掷表达。 当抛出的对象是一个类的对象,并用于初始化临时副本拷贝构造函数是无法访问,程序形成不良的 (即使临时对象本来被淘汰)。 同样,如果该对象的析构函数是无法访问的,程序是病态的(即使临时对象本来被淘汰)。



Answer 2:

不,这不对。

15.1.5当抛出的对象是类对象,复制/移动构造函数和析构函数必须是可访问的,即使复制/移动操作会被省略



文章来源: Can objects with private copy constructors be thrown?