Использование конструктора преобразования неявно требует конструктора копирования - PullRequest
0 голосов
/ 03 ноября 2011

Я изучаю 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.

Ответы [ 2 ]

3 голосов
/ 03 ноября 2011

Потому что:

void testFunction(Test in)

Вы передаете объект Test по значению, который вызывает конструктор копирования.

0 голосов
/ 03 ноября 2011

Другое объяснение вопроса:
Если вы удалите конструктор копирования Test(const Test&) из класса Test, вы должны использовать конструктор копирования, сгенерированный компилятором, который вызовет конструктор копирования subClass sub.Но вы определили его как subClass(subClass&), что не соответствует соглашению.Так что если вы измените его на subClass(const subClass&), вы можете удалить Test(const Test&) сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...