Как работает создание объекта для этого шаблона класса? - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть код ниже, который я пробовал из курса, который я проводил, который в значительной степени выполняет то, что ожидается

#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<char> a('A', 'A');?Я не видел ошибок компиляции с g++ -Wall -Wextra --std=c++11.Кроме того, если будет признателен конкретный пункт из cppreference, который объясняет это поведение, так как я упустил определение, где объясняется такое поведение.

1 Ответ

1 голос
/ 25 сентября 2019
// 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, b, c or d позже, после создания, на них нужно было бы ссылаться по имени.

...