2017-01-26 2 views
2

я наткнулся на этот код на другой день:«сопзЬ T сопз» в объявлении параметра

template< class T > 
T findMax(const T const * data, 
     const size_t const numItems) { 
// Obtain the minimum value for type T 
T largest = 
    std::numeric_limits<T>::min(); 
for(unsigned int i=0; i<numItems; ++i) 
if (data[i] > largest) 
largest = data[i]; 
return largest; 
} 

Почему параметры каждый из которых содержит два const s?

+3

Возможный дубликат [В чем разница между const int \ *, const int \ * const и int const \ *?] (Http://stackoverflow.com/questions/1143262/what-is-the-difference -between-const-int-const-int-const-and-int-const) – clcto

+2

Я отменяю свое закрытое голосование, поскольку это для 'const T * const' not' const T const * '. – clcto

+0

@clcto Тем не менее, ответы там объясняют, как читать 'const' в целом. Конечно, они могут быть излишними здесь. – Gassa

ответ

8

Для этого нет веской причины. Более того, такое явное повторение квалификаторов const является незаконным в C++. Код плохо сформирован.

7.1.6.1 The cv-qualifiers [dcl.type.cv]

1 There are two cv-qualifiers, const and volatile. Each cv-qualifier shall appear at most once in a cvqualifier-seq.

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

+0

На самом деле возникает интересный вопрос - имеет ли смысл вкладывать их обоих? – Slava

+0

@Slava: если вы имеете в виду 'const volatile', да, это имеет смысл. Подумайте, например. память с отображением. 'const' означает, что вы не можете писать (не можете установить часы),' volatile' гарантирует (хорошо .. пытается), что часы будут считаны в соответствующее время. – lorro

+0

@lorro хорошая точка – Slava

2

Один из модификаторов const является избыточным; имея здесь два, не делает ничего больше, чем один сам по себе (я был бы удивлен, если бы это не выдало предупреждения, по крайней мере).

Возможно, автор имел в виду const T* const, который является постоянным указателем на постоянный экземпляр T.

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