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};