c中的自动引用

这段代码在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&amp ;.

问题是,为什么我的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

点赞