2012-10-22 88 views
1

爲了得到這個代碼編譯:常量莢和std :: vector的

std::vector<Foo> factory() 
{ 
    std::vector<Foo> data; 
    return data; 
} 

我必須確定我的POD是這樣的:

struct Foo 
{ 
    const int i; 
    const int j; 

    Foo(const int _i, const int _j): i(_i), j(_j) {} 

    Foo(Foo& foo): i(foo.i), j(foo.j){} 

    Foo operator=(Foo& foo) 
    { 
     Foo f(foo.i, foo.j); 
     return f; 
    } 
}; 

這是定義一個吊艙,其中正確的處理方法我不想在創建後更改pod成員?爲什麼我不得不定義複製構造函數並重載賦值運算符?這是否兼容std::vector的不同平臺實現?你認爲有這樣的const PODS是錯誤的嗎?我應該把它們作爲非const嗎?

+2

你的'operator ='是無意義的;不是分配左操作數的成員(不能完成),而是創建一個新對象並將其返回。這項任務如何? – Praetorian

+0

更改爲'Foo&' –

+0

@CodingMash這樣做,你會返回一個臨時參考 – Praetorian

回答

3

這是未定義的行爲,通過您無法分配的類型創建std::vector。您不能指定const成員的POD。

+4

除此之外,您的類型根本不是POD,POD類型不能具有用戶定義的構造函數或'operator ==' – BigBoss

0

你問幾個問題:

這是定義一個吊艙在那裏我沒有興趣在創建後改變莢成員正確的做法?是形成不良的

你的問題,因爲你興趣在創建之後改變莢成員。例如,通過使用std::vector,您要求vector::resize(),例如,允許通過賦值運算符修改對象的所有成員。

另外,正如其他人指出的,您的operator=沒有多大意義。它肯定不會做你認爲它的事情。具體而言,在表達a=b之後,a的成員保持不變。

爲什麼我強制定義複製構造函數並重載賦值運算符?

由於您使用std::vector。考慮C++ 2003,§23.1/ 3,「存儲在這些組件中的對象類型必須滿足CopyConstructible 類型的要求,以及Assignable類型的附加要求。」

實際上,這是因爲vector需要能夠移動你的對象,而它的內存管理。

是對的std::vector不同平臺實現兼容這個?

是的。對於std::vector的任何實現,您的類型必須是CopyConstructible和Assignable。

你認爲const PODS是這樣的嗎?

是的,它與您的預期用法相矛盾。你打算把它們放入一個向量中,在那裏它們將被修改。

我應該把它們作爲非const嗎?

是的。如果您將它們保留爲非常量,那麼您不需要用戶定義的複製構造函數和用戶定義的賦值運算符。