Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;为模板类调用模板化构造函数_C++_Templates - Fatal编程技术网

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?