Я не понимаю, почему компилятор выбирает конструктор копирования моего класса Production
и не имеет других функций-кандидатов. я сделал минимальный пример, чтобы продемонстрировать ошибку:Конструктор шаблонов Variadic и конструктор копирования
#include <string>
#include <typeindex>
#include <iostream>
struct DummyProduction {
};
struct Dep {
};
struct Pro {
};
class ModuleBase {
};
template<typename Production = DummyProduction>
class Provider {
public:
template<typename... Dependencies>
Provider(ModuleBase& module, Dependencies... args)
{
std::cout << "Provider called!" << std::endl;
}
Provider(const Provider&) = delete;
};
class TargetController : public ModuleBase,
public Provider<Pro>,
public Provider<>
{
public:
TargetController();
private:
Dep p;
};
TargetController::TargetController() :
ModuleBase(),
Provider<Pro>(*this, &p),
Provider<>(*this),
p()
{
}
int main()
{
TargetController x;
return 0;
}
Я попробовал его с GCC и лязгом. Вот ссылка на нерабочий пример: link.
Для Provider<Pro>(*this, p)
вызывается правый конструктор. Но для второго примера Provider<>(*this)
компилятор пытается вызвать экземпляр-конструктор.
Из того, что я понял с страницы Overload resolution, все функции, соответствующие выражениям, должны попадать внутрь набора функций-кандидатов. Но либо переменный constuctor не находится внутри набора для провайдера без зависимостей, либо компилятор выбирает конструктор-копию, несмотря на удаление.
Есть ли способ избежать такого поведения?
Такой вопрос заставляет меня смириться :). +1 для него – Makketronix
[OT]: Обратите внимание, что 'p' еще не построено в вызове' Provider (* this, p) '. –
Jarod42
@ Jarod42 Да, это правильно, я забыл, что, уменьшая код до минимального примера. – Nagua