C++ 这个类模板的对象创建是如何工作的?

C++ 这个类模板的对象创建是如何工作的?,c++,template-instantiation,C++,Template Instantiation,我有一段代码,下面是我在一门课程中尝试的代码,它基本上完成了预期的任务 #include <iostream> template <typename T, class U = int> class A { public: T x; U y; A(T x, U y) { std::cout << x << " " << y << std::endl; } }; int main() { A&

我有一段代码,下面是我在一门课程中尝试的代码,它基本上完成了预期的任务

#include <iostream>

template <typename T, class U = int>
class A {
public:
    T x;
    U y;
    A(T x, U y) { std::cout << x << " " << y << std::endl; }
};

int main() {
    A<char> a('A', 'A');
    A<char, int>('A', 65);
    A<char, char>('A', 'A');
    return 0;
}
但我不明白下面的部分是如何工作的。我理解模板的默认参数部分是如何工作的,但不理解一旦模板类被实例化,代码是如何创建对象的

A<char, int>('A', 65);
A<char, char>('A', 'A');
为什么不像第一种情况那样创建带有A'A',A';的显式对象;?使用g++-Wall-Wextra-std=c++11编译时,我没有看到编译错误。另外,如果CPPFREFERENCE中有一个解释这种行为的特定条款,我会很感激,因为我没有确定这种行为是在哪里解释的

// Explicit instantiation of A<char, int>.
// The result of the constructor call A(char x, int y) is not used, i.e. 
// is not bound to a name as in A<char> a('A', 'A'); however, because the
// constructor has a side effect of calling std::cout, we can still tell that
// it ran.
A<char, int>('A', 65);

// Explicit instantiation of A<char, char> that is not bound to a name.
A<char, char>('A', 'A');

注意,您可以给另一个A指定名称b、c和d或任何其他有效标识符,但仍然可以看到相同的结果;或者,由于名为a的名称不在其定义之后使用,您也可以删除该名称,只需将其作为对构造函数的调用,而不会像其他名称那样绑定到名称。不管怎样,这个特定程序的结果都是一样的,尽管在构建之后,如果您还想对a、b、c或d执行其他操作,它们将需要一个名称来引用。

我无法告诉您为什么它们不给对象命名,但因为它们不给对象命名,所以它所做的是创建一个临时对象,并在最后销毁;声明之后。@NathanOliver:这是官方记录的还是特定于编译器的?这种临时对象已知在别处使用?由于C++标准的不同部分,它需要由所有编译器支持。这是经常发生的事情。假设你有一个函数,它取了一个你不关心的a。不需要创建一个对象并给它命名,您只需执行functionA'A'、'A';