C++ C++;为模板类调用模板化构造函数
我有一个模板类,带有可变参数列表:C++ C++;为模板类调用模板化构造函数,c++,templates,C++,Templates,我有一个模板类,带有可变参数列表: template<class ...Args> struct Data{ }; 问题是,这个是转到Args还是转到CtrArgs 另外,也许这很容易检查。但我问这个问题是因为在更复杂的情况下,我有非常奇怪的行为。Data是通过使用模板参数int,MyClass,bool实例化类模板数据所获得的类型。因此,在您的示例中,模板参数转到Args 无法显式指定构造函数的模板参数。C++标准甚至毫不含糊地表示:(<1.4.1/7): [注意:因为显式模板参
template<class ...Args>
struct Data{
};
问题是,这个
是转到Args还是转到CtrArgs
另外,也许这很容易检查。但我问这个问题是因为在更复杂的情况下,我有非常奇怪的行为。Data
是通过使用模板参数int
,MyClass
,bool
实例化类模板数据所获得的类型。因此,在您的示例中,模板参数转到Args
无法显式指定构造函数的模板参数。C++标准甚至毫不含糊地表示:(<1.4.1/7):
[注意:因为显式模板参数列表紧跟在函数模板名称之后,并且因为转换成员函数模板和构造函数成员函数模板是在不使用
函数名,则无法为这些函数模板提供显式模板参数列表。
-[完注]
数据
是Args
<然后,代码>CtrArgs
从构造函数参数推断为int、MyClass、bool
。无法显式指定构造函数的模板参数。CtrArgs
只能从提供给构造函数的参数中推导。@T.C.不是作为int&&,MyClass&&,bool&
?@tower120否,&&
添加到函数参数列表中。如果传递右值,则推导的类型本身没有引用。@tower120。如果传递左值,则类型将被推断为T&
,即左值引用,然后引用折叠将T&&
转换为T&
。我希望CtrArgs
始终自动扣除。是否有任何“特殊规则”,其中模板参数将转到CtrArgs?@tower120如果可能,它将始终自动推导。所有函数模板的行为都是这样的。
template<class ...Args>
struct Data{
template<class ...CtrArgs>
Data(CtrArgs&& ... args){
// do something
}
};
Data<int, MyClass, bool> dat(1, MyClass(), false);
^^^^^^^^^^^^^^^^^^
Is this Args? Or CtrArgs?