コンパイラが私の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)
の場合、右側のコンストラクタが呼び出されます。しかし、2番目の例のProvider<>(*this)
の場合、コンパイラーはコピーコンストラクターを呼び出そうとします。
Overload resolutionページから私が理解したところでは、式に一致するすべての関数が候補関数セット内に入るはずです。しかし、バリデーションコンストラクタは、依存関係のないプロバイダのセットの中にはないか、またはコンパイラは、beeingが削除されたにもかかわらずコピーコンストラクタを選択します。
この現象を回避する方法はありますか?
このような質問は私を謙虚にします:)。 +1 – Makketronix
[OT]: 'p'は' Provider(* this、p) 'の呼び出しではまだ構築されていません。 –
Jarod42
@ Jarod42はい、そうです。コードを最小限に抑えながら、忘れました。 – Nagua