2017-01-18 2 views
4

Этот код дает мне странную отладочную информацию в визуальной студии 2015авто ссылки на C++

int main() { 
    const int i = 42; 
    auto j = i; const auto &k = i; auto *p = &i; 
    const auto j2 = i, &k2 = i; 
} 

Полученные типы были:

&k = const int & 
&k2 = const int * 

Я думаю, что те должны быть оба const int &.

Вопрос: Почему мой Visual Studio Debugger говорит, что &k и &k2 имеют различный тип?

+2

И вопрос ...? :) – Pierre

+0

Вопрос в том, почему & k и & k2 - разные типы? –

+0

Откуда вы знаете, что & k и & k2 имеют разные типы? – cpplearner

ответ

1

k и k2 оба являются const int& типами.


Полный список типов. Обратите внимание, что верхний уровень const отбрасывается для вывода типа auto.

int main() 
{ 
    const int i = 42; 
    auto j = i; // i is an int (const is top-level) 
    const auto &k = i; // k is a const int& 
    auto *p = &i; // p is a const int* (const persists as not top-level). 
    const auto j2 = i, &k2 = i; // j2 is a const int, k2 is a const int& 
} 

Наконец, если бы вы написали

auto q = &k2; 

то тип q является const int*, так как const не на высшем уровне, так не отбрасывается, но auto тип вычет. Это восстанавливает информацию об отладке, которую вы наблюдаете.

j2 и k2 выглядят несходными, но на самом деле это связано с тем, как декларации работают с запятой, ср. Путаница может быть несорванный написав

const int j2 = i, &k2 = i;

Вы всегда можете узнать наверняка с помощью стандартной функции is_same библиотеки C++ 11: например

bool am_I_the_same = std::is_same<decltype(k2), const int&)::value

Где decltype восстанавливает тип своего аргумента.

Код: http://en.cppreference.com/w/cpp/types/is_same

+0

Спасибо. Проблема в том, что я не понимаю, почему & k is (const int & Reference). BUT & k2 is (const int * Pointer)? Не должны ли быть const int &? –

+0

Вы пытаетесь сказать, что это из-за среды отладки? Почему не & k? j2 и k2 выглядят несходными!? как объявления работают с запятой!? Я также тестирую с тем же, что и вы сказали, это правда, но не понимаю .... Проверьте свой ответ! Спасибо –

+0

Нет, это ничего не касается среды отладки. Я доказываю, почему 'q' является' const int * '. Что касается запятой, это означает, что 'j2' и' & k2' (read & как обозначение здесь) являются одинаковыми типами 'const auto'. – Bathsheba

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