2012-02-02 122 views
0

是否有一個原因,爲什麼包含枚舉的結構的隱式複製構造函數將而不是使用const版本 - 或者爲什麼根本沒有複製構造函數?我希望創建一個隱含的拷貝構造函數,即:C++複製構造函數的結構與枚舉的簽名

X(const X& x) 

我知道有對的時候,這可能發生,例如,如果一個成員變量沒有一個拷貝構造函數,或者非常拷貝規則構造函數。我想我的問題是這與枚舉有什麼關係 - 如果這是適用的規則?

添加我自己的複製構造似乎工作。

示例 - 什麼,如果有的話,拷貝構造函數中隱式創建:

struct MyStruct { 
    int myInt; 
    double myDouble; 
    MyEnum myEnum; 
}; 
+2

從什麼時候C++合成複製構造函數時它不能?如果其中一個成員不能被複制,那麼根本沒有自動拷貝構造函數生成,故事結束。 – 2012-02-02 07:45:08

+2

如果它是隱含的,你能解釋你如何知道拷貝構造函數有這個簽名? 'int main(){const X x1; X x2(x1); '不行? – 2012-02-02 07:45:33

+1

請給出一個具體的例子來說明這個問題。 – HighCommander4 2012-02-02 07:52:54

回答

1

你對枚舉的猜測是錯誤的;問題在別的地方。如果沒有顯式定義拷貝構造函數,則以下代碼編譯時不會出現問題,並且如果存在具有非const引用的拷貝構造函數,則無法編譯。

#include <iostream> 
#include <iterator> 
#include <vector> 

enum MyEnum { 
    e0, e1, e2 
}; 

struct MyStruct { 
    int myInt; 
    double myDouble; 
    MyEnum myEnum; 
    // MyStruct(MyStruct&){} // uncomment to make compilation fail 
}; 

std::ostream& operator<<(std::ostream& out, const MyStruct& s) { 
    out<<"{"<<s.myInt<<","<<s.myDouble<<","<<s.myEnum<<"}"; 
    return out; 
} 

int main() { 
    MyStruct s = {42, 3.1415926, e0}; 
    MyStruct s1 = s; 
    std::vector<MyStruct> v(10, s1); 
    std::copy(v.begin(), v.end(), std::ostream_iterator<MyStruct>(std::cout,"\n")); 
    return 0; 
} 

正如其他人在評論中指出,一個現實的例子證明錯誤需要了解什麼是真正的問題。

+0

你說得對。問題在代碼中的其他地方。我的問題是我無法訪問所有內容。有趣(?)的事情是,當我實現我自己的拷貝構造函數並調用'push_back'時,它永遠不會返回。我猜想某處存在內存和/或線程問題。如果我沒有弄亂構造函數當然:-) – Magnus 2012-02-02 21:12:40

0

這是一個有點出我的專長。

當您嘗試從X的非常量左值實例構造X時,簽名X(X&)將更接近匹配並被選中。

+4

但是隻有當兩個表單都被聲明,只有它們都是用戶聲明的時候纔會發生。 – 2012-02-02 07:52:41