我不明白爲什麼編譯器會選擇我的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頁面瞭解的內容中,匹配表達式的所有函數應該進入候選函數集。但是,可變參數不在沒有依賴關係的提供程序的集合內,或者編譯器選擇複製構造函數,儘管被刪除了。
有沒有辦法避免這種行爲?
這樣的問題讓我謙虛:)。 +1爲 – Makketronix
[OT]:請注意'p'尚未在調用'Provider(* this,p)'中構造。 –
Jarod42
@ Jarod42是的,這是對的,我忘記了將代碼簡化爲一個簡單的例子。 – Nagua