2013-10-18 21 views
1

我想使用等效的std::pair<bool, std::string>作爲函數返回類型。在下游代碼中,使用okmsg而不是firstsecond訪問器會更好,以避免不必要的API查找。而且我似乎無法使用繼承正確地編寫它,因爲std::pair可能會在沒有虛擬析構函數的情況下泄漏。想要避免我自己的結構作爲Renamed std::pair members中的解決方案 - 重用現有的Move構造函數和其他管道。它有可能嗎?專門對中的自定義存取器名稱

編輯:

後的反饋似乎是推薦的路要走是:

struct res { 
    bool ok; 
    std::string msg; 
}; 

res fnk() { ...; return r }; 

難道我理解正確的是C++編譯器11預計將產生移動的構造,以避免複製字符串?

+0

編譯器爲您提供了所有必要的管道。你不能免費得到的是關係運算符和一個「std :: make_pair」等價物。 – juanchopanza

+0

你是說在'struct res {bool ok; std :: string msg}; res fnk(){...; return r};''當'fnk'返回時''會自動將'r'的值移入接收者? –

+2

這取決於你如何調用函數,但最有可能的情況是你得到複製elision。但編譯器會爲你生成一個移動拷貝構造函數和一個移動拷貝賦值操作符(除非你定義了你自己的構造函數,在這種情況下,你可以使用'default'重新啓用它們。請參見[here](http:// stackoverflow。 COM /問題/ 4943958 /條件換自動生成 - 的 - 默認構造函數,拷貝構造函數和默認 - 阿西))。 – juanchopanza

回答

1

想避免我自己的結構作爲Renamed std::pair members的解決方案 - 重用現有的Move構造函數和其他管道。

我相信這是誤解的根源:如果你自己編寫結構,the compiler will generate the move constructor和「其他管道」爲你和免費。

而且任何體面的編譯器都應該能夠做到copy elision,也就是說,構造出適當的結果;不復制,不移動。

使用命名內聯訪問器也是一個選項,特別是如果你真的需要使用std::pair;它也在Renamed std::pair members問題和in one of the answers中有詳細說明。

在這種情況下做繼承在我看來是錯誤的;我不會那樣做。我沒有看到任何好處,但我確實看到了問題。