我學習C++,遇到了一些奇怪的問題,我無法在C++書籍或Web上找到任何信息。下面的代碼只是對轉換構造函數的測試:Test(int)。 testFunction在需要Test對象的地方獲取int值,並使用轉換構造函數創建一個Test對象以發送給該函數。這按預期工作。隱式使用轉換構造函數需要複製構造函數
#include <iostream>
using namespace std;
class subClass {
public:
subClass(int);
subClass(subClass&);
};
subClass::subClass(int i) {};
subClass::subClass(subClass& i) {};
class Test {
public:
Test(const Test&);
Test(int);
subClass sub;
};
Test::Test(const Test &)
: sub(1) {};
Test::Test(int in)
: sub(1) {};
void testFunction(Test in) {
cout << "testfunction\n";
};
int main() {
testFunction(4);
}
但是,如果我從測試類中刪除拷貝構造函數測試(const的測試&)我得到如下所示的錯誤消息。但複製構造函數從來沒有使用過,所以它爲什麼需要?
example.cpp: In function `int main()':
example.cpp:32: error: no matching function for call to `Test::Test(Test)'
example.cpp:13: note: candidates are: Test::Test(Test&)
example.cpp:24: note: Test::Test(int)
example.cpp:32: error: initializing argument 1 of `void testFunction(Test)' from result of `Test::Test(int)'
附加信息: 我注意到,無論是去除子類中的拷貝構造函數或參照testFunction傳遞參數能夠編譯功能,不測試的拷貝構造函數。我在cygwin中使用gnu g ++編譯器。
添加一行以從拷貝構造函數打印輸出表明它沒有被調用。 – snowape
@snowape這可能是因爲在代碼生成時,拷貝構造函數由於返回值優化而被忽略。然而,RVO並未改變複製構造函數在編譯時必須可用的事實。這是我最好的猜測。 –
對不起,我在回答時並沒有真正注意'main()',我只是看到錯誤在抱怨什麼。我同意邁克爾關於它實際上沒有被調用的原因。 –