【问题标题】:auto from const std::vector<>&; object or reference?来自 const std::vector<>& 的自动;对象还是参考?
【发布时间】:2012-01-10 02:20:03
【问题描述】:

假设我们有一个具有以下接口的对象:

struct Node_t {
 ... const std::vector< something >& getChilds() const;
 } node;

现在,我使用 auto 变量访问该属性,如下所示:

auto childs = node->getChilds();

childs 的类型是什么? std::vector&lt; something &gt; 还是对其中的引用?

【问题讨论】:

  • 不会是const std::vector&lt;something&gt;

标签: c++ c++11 auto


【解决方案1】:

childs 的类型将是 std::vector&lt;something&gt;

auto 采用与template type deduction 相同的规则。此处选择的类型与在 f(node-&gt;getChilds()) 之类的调用中为 template &lt;typename T&gt; f(T t); 选择的类型相同。

同样,auto&amp; 会为您提供与template &lt;typename T&gt; f(T&amp; t); 相同的类型,auto&amp;&amp; 将为您提供与template &lt;typename T&gt; f(T&amp;&amp; t); 相同的类型。

这同样适用于所有其他组合,例如 auto const&amp;auto*

【讨论】:

  • 什么是 auto&& ?参考参考?这是什么意思?
  • &amp;&amp; 表示右值引用。这是一个 C++11 特性,就像 auto 一样。 auto&amp;&amp; 可以成为左值引用(即像&amp; 这样的“普通”引用)或右值引用。
  • 澄清一下,您是说引用折叠规则适用于auto&amp;&amp;?
  • @Boris 够公平的。在我的辩护中,我的答案是最后发布的,所以我猜当我这样做时,我确实添加了其他答案,没想到它会成为被接受的答案。
【解决方案2】:

这是一个std::vector&lt;something&gt;。如果您需要参考,可以这样做:

auto & childs = node->getChilds();

这当然是一个 const 引用。

【讨论】:

  • C++ 使得意外调用复制构造函数变得如此容易:(
【解决方案3】:

auto 给你std::vector&lt;something&gt;。您可以指定引用限定符auto &amp;,或者,您也可以使用decltype

decltype( node->getChilds() ) childs = node->getChilds();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-02
    • 2021-02-26
    • 2011-05-06
    • 2012-03-07
    • 2016-02-12
    • 2019-04-23
    • 2021-07-12
    • 1970-01-01
    相关资源
    最近更新 更多