Как значение параметра T () по умолчанию интерпретируется в шаблоне? - PullRequest
0 голосов
/ 11 октября 2019

Я наткнулся на этот код, и я хочу знать, как T() интерпретируется с разными типами данных?

template <typename T>
class MyClass {

    T _val;
    std::string _message;


    // constructor
    MyClass(std::string const &msg, T defaultVal = T())
    : _val(defaultVal), _message(msg)
   {
        // some code that will use msg and defaultVal
   }


}

1 Ответ

0 голосов
/ 11 октября 2019

T() является примером значения инициализации . И он ведет себя по-разному в зависимости от того, что именно T. Непосредственные категории следующие:

Эффект инициализации значения:

  1. , если T является типом класса без конструктора по умолчанию или с пользователем-предоставленный или удаленный конструктор по умолчанию, объект является инициализированным по умолчанию ;

  2. , если T является типом класса с конструктором по умолчанию, который не является нипредоставленный пользователем или удаленный (то есть это может быть класс с неявно определенным или дефолтным конструктором по умолчанию), объект является инициализируемым нулями и затем это инициализированный по умолчанию , если он имеет нетривиальный конструктор по умолчанию;

  3. , если T является типом массива, каждый элемент массива инициализируется значением ;

  4. в противном случае объект инициализируется нулями .

"инициализация по умолчанию" и "ноль"инициализация "сами по себе являются терминами с точным значением, которое должно быть определено для точного типаг использовал. В конечном счете, инициализация в C ++ является чем-то вроде кроличьей норы. Я верю, что нет необходимости объяснять, что означает «инициализация нуля», это просто установка значения объекта на соответствующий ноль. Что касается «инициализации по умолчанию», она определяется следующим образом:

Эффекты инициализации по умолчанию:

  • , если T является типом класса, конструкторы считаютсяи подвергнут разрешению перегрузки против пустого списка аргументов. Выбранный конструктор (который является одним из конструкторов по умолчанию) вызывается для предоставления начального значения для нового объекта;

  • , если T является типом массива, каждый элемент массива по умолчанию-initialized;

  • в противном случае ничего не делается: объекты с автоматической продолжительностью хранения (и их подобъекты) инициализируются неопределенными значениями.

Теперь назовем пару примеров:

  1. int() - Следуя пунктам списка выше, мы инициализируем int как 0.
  2. std::string() - вызывает конструктор по умолчанию std::string, в результате чего получается пустая строка.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...