如果一個C++(隱式或顯式的)值構造通過接受其參數(一個或多個)值或參考給const,當它需要存儲在其對象參數(一個或多個)任何一種方式的副本?通過值或參考,在C++構造函數,需要存儲的副本?
這是我能想到的最短例如:
struct foo {
bar _b;
foo(bar [const&] b) // pass by value or reference-to-const?
: _b(b) { }
};
這裏的想法是,我想對酒吧的拷貝構造函數的調用最小化創建一個Foo對象時,在任何的各種方式foo對象可能被創建。
請注意,我確實知道一些關於複製elision和(命名)返回值優化的內容,並且我已閱讀"Want Speed? Pass by Value",但我不認爲該文章直接解決了此用例。
編輯:我應該更具體。
假設我不知道sizeof(bar)
,或者判斷bar
是根本,內置型(bar
可能是一個模板參數,並foo
可能是一個類模板,而不是一類)。另外,不要以爲foo
的構造函數可以被內聯(或bar
的,對於這個問題)。假設我至少可能使用實現RVO的編譯器。
我想什麼是那裏是一種可能性(因爲編譯器優化),像這樣的通話將調用沒有調用bar
「(S初始化列表S甚至執行在foo
_b(b)
時)拷貝構造任何」:
foo f = function_that_creates_and_returns_a_bar_object_using_rvo();
是否有可能(給定C++ 98標準),這是可以完成的,並且如果是這樣,是它或多或少可能如果foo
工作接受它的參數通過引用給const代替按價值?
我正在考慮這個答案,因爲它是最有前途的,並且它展示了這是C++ 98/03中的一個缺陷,它將由C++ 0x解決。但是,請參閱Alexey Malistov的回答(以及以下評論),以瞭解您可能希望通過C++ 98/03的價值傳遞的情況。 – 2009-12-09 13:56:40