Шаблон целочисленного конструктора параметров

Я не понимаю следующий конструктор (часть библиотеки Qt в src\corelib\tools\qstringbuilder.h), что это значит и как это работает?

class QLatin1Literal
{
public:
    int size() const { return m_size; }
    const char *data() const { return m_data; }

    template <int N>
    QLatin1Literal(const char (&str)[N])
        : m_size(N - 1), m_data(str) {}

private:
    const int m_size;
    const char * const m_data;
};

Ответ 1

Конструктор принимает строковый литерал как аргумент. Вы видите только синтаксис объявления шаблона для этого.

С таким конструктором m_size может быть найден в O (1), противоположном O (strlen (str)), требуемому в противном случае с конструктором без шаблона, принимающим char const* в качестве аргумента.

Следует помнить, что для каждой длины строки будет экземпляр шаблона, сгенерированного компилятором, чтобы в конечном итоге у вас появилось довольно много экземпляров этого шаблона в ваших библиотечных/двоичных/объектных файлах.

Ответ 2

Аргумент конструктора является ссылкой на массив символов N. Он инициализирует m_data, чтобы указать на первый символ, и m_size на один меньше, чем размер массива.

Строковый литерал, например "hello", представляет собой массив символов, содержащий символы в строке, за которым следует нулевой знаменатель. Итак, если конструктор вызывается с одним из следующих:

 QLatin1Literal lit("hello");
 assert(lit.size() == strlen("hello"));  // SUCCESS: m_size is inferred as 5

он выведет значение 6 для N (так как массив содержит пять символов "hello", плюс терминатор) и инициализирует m_size до 5 (фактическая длина строки).

Помните, что это может пойти не так, если массив фактически не является строковым литералом; например:

char buffer[1000] = "hello";  // array size is larger than string+terminator
QLatin1Literal lit(buffer);
assert(lit.size() == strlen("hello"));  // FAIL: m_size is inferred as 999

Ответ 3

Это означает, что str является ссылкой на массив символов N констант. Это просто означает, что конструктор принимает в качестве аргумента массив символов, например, строковый литерал.