【问题标题】:auto reference in c++C++中的自动引用
【发布时间】:2017-01-18 08:52:42
【问题描述】:

这段代码在 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 调试器说 &k&k2 属于不同类型?

【问题讨论】:

  • 问题是……? :)
  • 问题是,为什么 &k 和 &k2 是不同的类型?
  • 你怎么知道 &k 和 &k2 是不同的类型?
  • 投了赞成票,理由是我很难让我的答案正确。我喜欢认为这个问题有深度。并且很聪明。
  • @cpplearner Visual Studio 调试

标签: c++ visual-c++ reference auto


【解决方案1】:

kk2 都是 const int& 类型。


这是完整的类型列表。注意顶级constauto类型推导丢弃。

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

【讨论】:

  • 谢谢。问题是,我不明白为什么 &k 是 (const int & Reference) 但 &k2 是 (const int * Pointer)?不应该都是 const int & 吗?
  • 你是说是调试环境造成的吗?为什么不 &k ? j2 和 k2 看起来不一样!?声明如何与逗号一起使用!?我也Test with the 和你说的一样,是真的,但是不明白....请检查您的答案!谢谢
  • 不,它与调试环境无关。我证明了为什么qconst int*。至于逗号,表示j2&k2(这里读&表示引用)是相同的const auto类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
相关资源
最近更新 更多