C++ 为什么可以';我是否使用左值构造函数参数创建这个模板化类的临时类?
就我的一生而言,我似乎不能为这门课创造一个临时的机会,为什么它不允许我呢C++ 为什么可以';我是否使用左值构造函数参数创建这个模板化类的临时类?,c++,templates,most-vexing-parse,C++,Templates,Most Vexing Parse,就我的一生而言,我似乎不能为这门课创造一个临时的机会,为什么它不允许我呢 template <typename T> struct Dog { Dog(T t) : tag(t) {} T tag; }; int main() { int tag = 6; Dog<int>(6); // Works fine Dog<int>(tag); // On Visual Studio I get no default co
template <typename T>
struct Dog
{
Dog(T t) : tag(t) {}
T tag;
};
int main()
{
int tag = 6;
Dog<int>(6); // Works fine
Dog<int>(tag); // On Visual Studio I get no default constructor exists for class Dog<int>
// On onlineGDB I get error: no matching function for call to ‘Dog::Dog()’
}
此外:
Dog{tag};//作品
我之所以这样认为是因为这是聚合初始化?代码>狗(6)编码>和<编码>狗(6)代码>声明临时Dog
s,用值6构造。在第一种情况下,模板参数推断工作正常,在第二种情况下,模板参数是显式的
然而,Dog(标签)代码>未创建临时文件。它是类型为Dog
的变量tag
的声明符。通常,括号是多余的,即。
int x
,int(x)
,int((x))
都是等效的。在本例中,错误在于您没有提供一个初始值设定项,用于推断Dog
的模板参数。另一个错误是,在进行类模板参数推断的声明器周围不能有括号
Dog(标签)
类似,它是类型为Dog
的变量tag
的声明符。由于参数是显式的,因此不需要进行任何推导,但这里的错误是您没有Dog
的默认构造函数,并且您自己也没有为构造函数提供参数
Dog{tag}代码>与括号中的问题不同。它声明了一个临时的<代码>狗>代码> >代码>标签>代码>由于C++解析规则,
Dog<int>(tag);
Dog(标签);
相当于
Dog<int> tag;
Dog标签;
引入大括号初始化是为了避免这些解析歧义:
Dog<int>{tag};
Dog{tag};
Dog<int> tag;
Dog<int>{tag};