Я изучаю C ++, и я столкнулся с чем-то странным, что я не смог найти никакой информации ни в своей книге C ++, ни в Интернете.Приведенный ниже код является просто тестом конструктора преобразования: Test (int).testFunction получает int, где ожидается объект Test, и конструктор преобразования используется для создания объекта 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);
}
Однако, если я удаляю конструктор копирования Test (const Test &) из класса Test, я получаю сообщение об ошибке, показанное ниже.Но конструктор копирования никогда не используется, так зачем он нужен?
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 позволяет компилировать функцию без конструктора копирования Test.Я использую компилятор gnu g ++ в cygwin.