2011-01-09 92 views
1

如果拷貝構造函數是由private然後在複製構造函數不被調用用於複製初始化或優化?

案例1:沒有錯誤,編譯器不一樣,如果拷貝構造函數是在類中定義的照顧。

案例2:錯誤,複製構造函數是私有的,當它被製作爲public時,它被省略。

它是否直接優化副本而不會注意到如果構造函數是private

#include <string> 
using std::string; 

class T 
{ 
    string s; 
    T(const T &obj):s(obj.s){} 
public: 
    T(const string &str):s(str){} 
}; 

int main() 
{ 
    T a = ("Copy Initialization");  //Case: 1 

    T b = T("Copy Initialization"); //Case: 2 
} 
+0

在`Case:1`中,實際上並沒有創建一個`T`類型的臨時對象。你怎麼能給它分配``````T`型`? – Mahesh 2011-01-09 14:17:21

回答

5

情況2來下12.8/31 N3225:

如果 複製/移動的構造或複製/移動 賦值操作符的對象的程序是形成不良的是 隱式地使用ODR-並且特殊的 成員函數不可訪問。

只是因爲抄襲ctor並不意味着它不會被使用。 3.2/2:

一組候選的 功能的ODR使用的,如果它是 通過重載解析選擇時 從 潛在評估表達稱爲的成員。 (注:這包括調用命名爲 的函數(5.2.2),操作符 重載(第13章),用戶定義的 轉換(12.3.2),分配 功能放置新(5.3.4),作爲 以及非默認初始化 (8.5)。即使 調用實際上被 實現取消,複製構造函數或移動構造函數也不會使用。末端音符]

當心當然,這是MSVC的不充分 C++ 0X兼容,因爲(a)的C++ 0x不是標準的是,並沒有最終確定;和(b)無論如何MSVC還沒有實施一切。但是這個東西並沒有從C++ 03中大幅改變,所以我相信這個解釋仍然存在。

第1種情況也會出現這種情況,除了在兩個C++ 03編譯器上我檢查過它沒有得到那麼多,因爲沒有可能從字符串文字轉換到T.我不能麻煩檢查是否有任何額外的轉換序列允許在C + + 0x,可能有一個新的條款在任何地方:-)

這仍然是一個謎,爲什麼MSVC允許案例1有史以來,即使有公共拷貝ctor 。它是否允許嚴格的C++ 03模式?

2

案例1:沒有錯誤,如果拷貝構造函數是在類中定義的編譯器不關心。

T a = ("Copy Initialization");should give an error,因爲沒有合適的構造從"const char [20]"轉換爲"T"

你的意思是T a = std::string("Copy Initialization");

它是否直接優化副本而不會注意到如果構造函數是私有的?

不,它不能。編譯器通常在代碼優化階段之前執行句法和語義分析。

+0

@ Prasoon在C++ 0x編譯器中沒有``T``const char [20]`,因爲進行了隱式類型轉換。 – cpx 2011-01-09 14:23:03

+0

@ Dave18:http://ideone.com/Yij87 – 2011-01-09 14:24:24