2017-01-18 60 views
4

此代码给我奇怪的调试信息在Visual Studio 2015年自动参考++

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

kk2都是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类型推演。这会恢复您观察到的调试信息。

j2k2看起来不同但实际上这是由于声明如何与逗号,比照工作这种混乱可以通过编写

const int j2 = i, &k2 = i;

被松绑你总是可以找到肯定使用C++ 11标准库函数is_same: 例如

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是(const int&Reference)但是&k2是(const int *指针)?不应该都是const int&? –

+0

你是否想说因为调试环境?为什么不&K? j2和k2看起来不一样!?声明如何与逗号一起工作!?我也跟你说的一样,这是真的,但不明白......。请检查你的答案!谢谢 –

+0

不,它与调试环境无关。我证明了为什么'q'是一个'const int *'。至于逗号,这意味着'j2'和'&k2'(在这里读作&表示引用)与'const auto'类型相同。 – Bathsheba