2015-06-13 3 views

ответ

10

Это сокращенное что-то вроде этого:

template <typename T, size_t N> 
constexpr size_t size_of(T (&anonymous_variable)[N]) { 
    return N; 
} 

В функции, вы на самом деле не нужен имени переменный, просто шаблон вычет на N - так что мы можем просто выбрать опустить Это. Скобки являются синтаксически необходимыми, чтобы передать массив по ссылке - вы не можете передать массив по значению.

+0

Спасибо! У этого шаблона есть имя? – Phonon

+0

@Phonon Не то, что я знаю. – Barry

+3

@Phonon: Это стандартный синтаксис, который существует, поскольку древний C. C не имеет ссылок, но типы указателей массива были описаны как 'T (*) [N]' с начала времен. Замена '*' '' 'кроме того. – AnT

4

Это передача массива в качестве параметра по ссылке:

template <typename T, size_t N> 
constexpr size_t size_of(T (&)[N]) { 
    return N; 
} 

Как вы не можете передать массив как это:

template <typename T, size_t N> 
constexpr size_t size_of(T[N]) { 
    return N; 
} 

Если массив получил название, это будет выглядеть :

template <typename T, size_t N> 
constexpr size_t size_of(T (&arrayname)[N]) { 
    return N; 
} 
+0

Почему средний блок является незаконным? – Phonon

+0

@ Массивы Phonon не могут быть переданы по ссылке; они передаются по значению. – Joe

Смежные вопросы