Инициализация шаблонных переменных с использованием списка инициализаторов - PullRequest
1 голос
/ 23 мая 2019

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

template <typename T>
class A
{
public:
    A() : _mem(T()) {};
private:
    T   _mem;
};

Первое, что мне не совсем понятно, это инициализация _mem в списке инициализаторов. Как называется эта техника (?)? Если я смотрю в отладчике, _mem имеет значение 0. Если есть способ c ++ 11 сделать то же самое, могу ли я получить некоторые комментарии по этому поводу?

Ответы [ 2 ]

3 голосов
/ 23 мая 2019

Это просто для защиты от неинициализированного A::_mem, когда T является типом POD или встроенным (например, int). Использование списка инициализатора конструктора : _mem(T()) по умолчанию создаст T и инициализирует _mem с ним. Например:

struct POD {
    int num;
};

// ...

A<POD> a;

Здесь a._mem будет унифицированно (в данном случае это означает, что a._mem.num унифицированно.) : _mem(T()) предотвращает это и инициализирует a._mem.num в 0.

Однако, начиная с C ++ 11, вы можете просто использовать встроенную инициализацию:

template <typename T>
class A {
public:
    A() {};
private:
    T _mem{};
};

T _mem{}; будет конструировать по умолчанию _mem, что, в свою очередь, означает, что POD::num будет построено по умолчанию, что для int означает, что оно будет инициализировано нулями.

2 голосов
/ 23 мая 2019

Если у него есть имя, я его не знаю.

Что происходит:

T() создает временные T и Инициализирует ноль it.

_mem(T()) делает _mem копию временного T. Примечание: современный компилятор почти наверняка удалит копию и просто инициализирует ноль _mem. Для этого по-прежнему необходимо, чтобы T был копируемым или перемещаемым, поэтому _mem(T()) и _mem() не совсем совпадают.

Единственное существенное отличие C ++ 11, о котором я могу подумать, это то, что вы можете использовать фигурные скобки _mem{T{}} для Инициализация списка . Не полезно здесь, но очень полезно в других обстоятельствах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...