2016-05-24 4 views
1

Я написал следующий код и для указателя показывает правильный тип аргумента, но когда я использую ссылку, он показывает только int и не const. Зачем?Почему аргумент шаблона ссылки не выводит const?

template <typename T> 
void increment(T& x) 
{ 
    std::cout << "Argument type is : " << typeid(x).name() << std::endl; 
    //x = x + 1; 
} 

template <typename T> 
void increment(T* x) 
{ 
    std::cout << "Argument type is : " << typeid(x).name() << std::endl; 
    //x = x + 1; 
} 

int main() 
{ 
    const int x = 0; 
    const int y = x; 
    increment(x); 
    increment(&y); 
} 

Выход:

Argument type is : int 
Argument type is : int const * 

Пожалуйста, вы можете объяснить, почему const не показана со ссылкой?

+0

Поскольку 'const' является классификатором, а не типом? – arrowd

+1

почему тогда он показывает этот определитель для аргументов указателя? – Kapil

+1

Попробуйте выполнить печать: 'typeid (int const) .name()'. – Nawaz

ответ

2

От typeid reference:

Если тип является ссылочным типом, результат относится к std::type_info объект, представляющий ссылочный тип.

и

Во всех случаях, CV-классификаторы игнорируются TypeId (то есть, typeid(T)==typeid(const T))

(точнее верхнего уровня const) T, конечно, выведенной в const int.


Стандартные параграфы [expr.typeid]/4 и [expr.typeid]/5

+0

Итак, есть ли способ узнать, что T выводится как const int – Kapil

+0

и почему const не игнорируется в случае типа указателя – Kapil

+0

@Kapil Поскольку это не верхний уровень 'const'. Вы можете проверить 'const'-ness с признаком' std :: is_const'. – LogicStuff

4
C++ 11 §5.2.8/4

& hellip; Если тип типа ID- является ссылкой к возможному сорта -qualified типа, то результат выражения typeid относится к std::type_info объекта, представляющего резюме -unqualified, на который ссылается тип. & Hellip;

C++ 11 §5.2.8/5

верхнего уровня резюме -qualifiers по glvalue экспрессии или типа ID- то есть операнд typeid всегда игнорируются.

По существу, любой верхний уровень const отбрасывается, как и формальные типы аргументов аргументов wrt. результирующий тип функции, а также cv квалификация T в ссылочном типе T&.

Последнее возможно, чтобы не проводить различия между T& и только T – они дают тот же результат.

+0

Так что в основном в этом случае * const dropping * - это двухэтапный процесс. – Nawaz

+1

@Nawaz: Я думаю, что простейшая концептуальная модель и то, что правила предназначены для модели, - это двухэтапная трансформация, да. Удалите ссылку, затем удалите любую * cv * -qualification этого результата. Но формально рассматриваемый случай - всего лишь один шаг, согласно § 5.2.8/4. –

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