据我所知,当你把对象作为值时,应该创建副本。因此,如果存在,则应调用复制构造函数。如果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。 我错了,这是非标准行为并且在编译器中是错误的吗?
答案 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不符合标准的情况。