【问题标题】:is it a conflict? about c++ auto这是冲突吗?关于 c++ auto
【发布时间】:2017-07-06 00:31:13
【问题描述】:

在 C++ 入门 5 中,我看到了代码:

const int a = 40;
auto &b = a;

编译器可以推断出b,类型为:const int &
我认为这是合理的,因为 a 是 const int,如果 b 具有 int & 类型,我们可以更改 const int 的值,这是非法的。

但是,书上说自动推导会省略顶层的 const,使用这条规则,在代码中:auto &b = a; a 只有 int 类型,我们可以推迟 b 的类型为 int &,与 b 类型为 const int & 的冲突。

另一个问题是代码:

auto &a = 8;

编译器无法在代码中直接推断出 a 的类型为 const int &

const int a = 40;
auto &b = a;

编译器可以。为什么有区别?

【问题讨论】:

  • 不清楚你在问什么?请详细说明需要回答的具体问题。
  • 我认为defer这个词应该换成infer
  • @myaut 不是 infer, deduce
  • @Barry:他们非常接近。 IE。维基百科:Type inference is the ability to automatically deduce... 另外,infer joke
  • 谢谢,对不起我的英语不好。

标签: c++ c++11


【解决方案1】:

auto 推导,除了一些小例外,其工作方式与普通模板推导完全相同。假设我们有一个函数:

template <class T> void foo(T& param);

const int a = 40;
foo(a);

在本例中,T 将推导出为 const intparam 的类型将是 const int&amp;。同样的道理,auto&amp; b = a; 为您提供了对const int 的引用。

但是,foo(8) 不会编译。 T&amp; 只能绑定到左值,8 不是左值。所以这是不正确的。同样,auto&amp; a = 8; 格式不正确。

【讨论】:

  • 很少有小例外?
  • @carry 因为T const&amp; 可以绑定到右值。 T&amp; 不能。与模板相同。
  • @GillBates 与initializer_list有关。
  • @Barry 那么在推导 auto 的时候,我还是应该先省略顶层的 const 吗?
  • @Barry 另一个问题,关于 auto,在代码中:const int a = 0; auto b = a; b 将被推断为具有类型 int ,忽略顶级 const,在模板中是否相同?
猜你喜欢
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 2016-03-23
  • 1970-01-01
  • 2012-09-01
  • 2019-08-15
  • 2016-10-02
  • 2020-04-15
相关资源
最近更新 更多