Подтвердить что ты не робот

Const в аргументе шаблона

Каков эффект ключевого слова const в этом шаблоне?

template <class T, int const ROWNUM, int const COLNUM> 
class Matrix

Означает ли это, что этот шаблон принимает только параметр const? Если да, существует ли способ передать переменную как COLNUM и ROWNUM?

(когда я пытаюсь передать переменную как COLNUM для шаблона, она дает ошибку: "IntelliSense: выражение должно иметь постоянное значение" )

4b9b3361

Ответ 1

Он игнорируется:

[C++11: 14.1/4]: Параметр шаблона, не относящийся к типу, должен иметь один из следующих (необязательно cv-квалифицированных) типов:

  • интегральный или перечисляемый тип,
  • указатель на объект или указатель на функцию,
  • ссылка lvalue на ссылку на объект или lvalue для функции,
  • указатель на член,
  • std::nullptr_t.

[C++11: 14.1/5]: [Примечание. Другие типы запрещены явно или неявно правилами, определяющими форму шаблона-аргумента (14.3). -end note] Квалификаторы верхнего уровня для параметра шаблона игнорируются при определении его типа.

Такая же формулировка присутствует в том же месте в С++ 03.

Это частично потому, что аргументы шаблона должны быть известны во время компиляции. Итак, есть ли у вас const или нет, вы не можете передать какое-то значение переменной:

template <int N>
void f()
{
    N = 42;
}

template <int const N>
void g()
{
    N = 42;
}

int main()
{
    f<0>();
    g<0>();

    static const int h = 1;
    f<h>();
    g<h>();
}

prog.cpp: В функции ' void f() [с int N = 0]:
prog.cpp: 15: созданный здесь
prog.cpp: 4: ошибка: lvalue требуется как левый операнд присваивания
prog.cpp: В функции ' void g() [с int N = 0]:
prog.cpp: 16: созданный здесь
prog.cpp: 10: ошибка: lvalue требуется как левый операнд присваивания
prog.cpp: В функции ' void f() [с int N = 1]:
prog.cpp: 19: созданный здесь
prog.cpp: 4: ошибка: lvalue требуется как левый операнд присваивания
prog.cpp: В функции ' void g() [с int N = 1]:
prog.cpp: 20: созданный здесь
prog.cpp: 10: ошибка: lvalue требуется как левый операнд присваивания

Ответ 2

const не требуется в вашем случае

например, оба класса Matrix_A и Matrix_B ниже одинаковы для точки компилятора. const здесь просто для обеспечения того факта, что ROWNUM и COLNUM являются постоянными для людей, но не требуются.

template <class T, int const ROWNUM, int const COLNUM> 
class Matrix_A 
{
};

template <class T, int       ROWNUM, int       COLNUM> 
class Matrix_B
{
};

Кроме того, следующий класс Matrix_C также указывает аналогичные постоянные переменные ROWNUM и COLNUM по-другому:

template <class T> 
class Matrix_C
{
   static int const ROWNUM = 5;
   static int const COLNUM = 20;
};

// the following three objects use constant variables ROWNUM and COLNUM
Matrix_A<bool,5,20> a;
Matrix_B<bool,5,20> b;
Matrix_C<bool>      c;