这个 class 模板的对象创建是如何工作的?
How does the object creation work for this class template?
我在下面的代码中尝试了我正在学习的课程,它几乎完成了预期的工作
#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;
}
但我不明白下面的部分是如何工作的。我了解模板的默认参数部分如何工作,但不了解代码如何在实例化模板 class 后创建对象。
A<char, int>('A', 65);
A<char, char>('A', 'A');
为什么不像 A<char> a('A', 'A');
的第一种情况那样创建显式对象?我没有看到使用 g++ -Wall -Wextra --std=c++11
编译时出现编译错误。此外,如果 cppreference 中解释此行为的特定条款将不胜感激,因为我错过了确定解释此类行为的位置。
// 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');
请注意,您可以将名称 b、c 和 d 或任何其他有效标识符指定给其他 A,但仍然会看到相同的结果;或者,由于名为 a
的名称在其定义后未被使用,您也可以删除该名称,并使其成为对构造函数的调用,而不像其他名称那样绑定到名称。对于这个特定的程序,结果相同,尽管如果在构造之后你想用a, b, c or d
做其他事情,他们需要用一个名字来引用。
我在下面的代码中尝试了我正在学习的课程,它几乎完成了预期的工作
#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;
}
但我不明白下面的部分是如何工作的。我了解模板的默认参数部分如何工作,但不了解代码如何在实例化模板 class 后创建对象。
A<char, int>('A', 65);
A<char, char>('A', 'A');
为什么不像 A<char> a('A', 'A');
的第一种情况那样创建显式对象?我没有看到使用 g++ -Wall -Wextra --std=c++11
编译时出现编译错误。此外,如果 cppreference 中解释此行为的特定条款将不胜感激,因为我错过了确定解释此类行为的位置。
// 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');
请注意,您可以将名称 b、c 和 d 或任何其他有效标识符指定给其他 A,但仍然会看到相同的结果;或者,由于名为 a
的名称在其定义后未被使用,您也可以删除该名称,并使其成为对构造函数的调用,而不像其他名称那样绑定到名称。对于这个特定的程序,结果相同,尽管如果在构造之后你想用a, b, c or d
做其他事情,他们需要用一个名字来引用。