这段代码在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是不同类型的?
最佳答案 k和k2都是const int&类型.
这是完整的类型列表.请注意,顶级const将被丢弃以进行自动类型扣除.
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不是顶级的,所以不会丢弃而是自动类型推导.这将恢复您观察到的调试信息.
j2和k2看起来不一样,但实际上这是由于声明如何与逗号一起使用,参见可以通过写作来解决混淆
const int j2 = i,& k2 = i;
您总是可以使用C11标准库函数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