2012-06-05 72 views
7

可能重複訪問私有副本:
Can objects with private copy constructors be thrown?VS編譯器可以男星

據我所知,當你特羅對象作爲值,副本應被創建。所以複製構造函數應該被調用,如果存在。如果複製文件存在並且是私有的,那麼這會導致編譯錯誤。這裏是代碼示例

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中都成功地編譯了該代碼並調用private ctor。 我錯了,這是非標準的行爲,並在編譯器中的錯誤?

+0

我說得太快了。 http://ideone.com/hXrJd –

+2

@Ation:VS曾經是最差的標準兼容的C++編譯器,主要的編譯器之一(gcc,icc,comeau等)。它的支持者說現在好多了,我個人停止使用它。 –

回答

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發出:

[[email protected] ~]$ 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. 
[[email protected] ~]$ 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 
[[email protected] ~]$ 
0

的標準說異常必須可拷貝,因爲罰球可以進行復印。您已將複製構造函數設爲私有,所以它不應該編譯。

然而,它並沒有說明throw的執行是需要來做一個副本 - 實際上,它可能會被忽略或者甚至在C++ 11中移動。因此,雖然MSVC應該拒絕編譯代碼,理由是它不符合標準,但它仍然會這樣做,因爲它將與MSVC的做事方式一致。

這不太可能是一個錯誤,而只是一個VC不符合標準的情況。

+0

如何不遵守*不是bug? –

+1

@MarkB我想這取決於你如何定義一個錯誤。在這裏,我指的是微軟方面似乎有意爲之。從經驗上講,這正是他們「鬆懈」的東西。 –

+1

該標準明確指出,即使拷貝被刪除,拷貝構造函數仍然可用且可訪問。我看不出有什麼辦法將這種行爲解釋爲非bug。 –