VS编译器可以访问私有拷贝ctor

时间:2012-06-05 12:57:44

标签: c++ visual-studio

  

可能重复:
  Can objects with private copy constructors be thrown?

据我所知,当你把对象作为值时,应该创建副本。因此,如果存在,则应调用复制构造函数。如果copy ctor存在并且是私有的,那么这应该导致编译错误。这是代码示例

class Exception {
public:
Exception() {
    cout << "Exception()" << endl;
}

~Exception() {
    cout << "~Exception() " << endl;
}
private:
Exception(const Exception &c) {
        cout << "Exception(c)" << endl;
    }
};

下一个代码应该导致编译错误。

try {
        Exception local;

        throw local;
    } catch (...) {
    }

但VS 2005和VS 2008都成功编译了该代码并调用私有ctor。 我错了,这是非标准行为并且在编译器中是错误的吗?

2 个答案:

答案 0 :(得分:0)

我打算在这里说出这可能是一个合法的MSVC 10漏洞。但是,我找不到这方面的参考。

这是一个测试工具:

#include <cstdlib>
#include <string>
#include <iostream>
#include <iomanip>
using namespace std;

class Exception {
public:
Exception() {
    cout << "Exception()" << endl;
}

~Exception() {
    cout << "~Exception() " << endl;
}
private:
Exception(const Exception &c) {
        cout << "Exception(c)" << endl;
    }
};

int main()
{
    try {
        Exception local;

        int n = 42;

        throw local;
    } catch (...) 
    {
    }
}

由于您注意到的原因,此代码无法编译 - 复制构造函数为private,并且从类的上下文外部调用。

此代码在MSVC 10和MSVC 11 Dev Preview中成功编译。

RHEL6.2下的GCC 4.4.4发布:

[xxx@yyy ~]$ gcc --version
gcc (GCC) 4.4.4 20100726 (Red Hat 4.4.4-13)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[xxx@yyy ~]$ gcc hack.cpp 
hack.cpp: In function ‘int main()’:
hack.cpp:17: error: ‘Exception::Exception(const Exception&)’ is private
hack.cpp:29: error: within this context
[xxx@yyy ~]$ 

答案 1 :(得分:0)

标准规定异常必须是可复制的,因为throw可以复制。您已将复制构造函数设为私有,因此不应编译。

然而,它没有声明throw的实现是 required 来制作副本 - 实际上,它可能被删除或者在C ++ 11中被移动。因此,虽然MSVC应该拒绝编译代码,理由是它不符合标准,但它仍然可以,因为它可以与MSVC的工作方式一起使用。

这可能不是一个错误,而只是一个VC不符合标准的情况。