【问题标题】:Rule of thumb for using auto&& and const auto &使用 auto&& 和 const auto & 的经验法则
【发布时间】:2016-11-14 10:24:07
【问题描述】:

我研究过auto,我知道它从初始化值中推断出类型。如果我尝试编写一些使用auto 的指南,我可以将以下语句作为规则吗?

  1. auto && 用于所有可修改的值(右值和左值,因为它是通用参考),
  2. auto && 即使是只读值,
  3. 尽可能使用auto(个人偏好的编码风格)。

编辑

class Test
{
public:
    Test() = default;
    Test(const Test&) = default;
    Test(Test&&) = default;

    int i = 1;
};

Test getObj()
{
    return Test();
}

Test& getObjByRef()
{
    static Test tobj;
    return tobj;    
}

const Test getObjConst()
{
    return Test();
}

int main()
{
    auto && obj1 = getObj();
    obj1.i = 2;

    std::cout << " getObj returns: " << getObj().i << std::endl;

    auto&& obj2 = getObjByRef();
    obj2.i = 3;

    std::cout << " getObjByRef returns: " << getObjByRef().i << std::endl;

    auto && obj3 = getObjConst();

    //obj3.i = 4;  => //Error   C3490   'i' cannot be modified because it is being accessed through a const object

    return 0;
}

所以在上面的例子中,我对所有三个函数都使用了auto &amp;&amp;

  • getObj
  • getObjByRef
  • getObjConst

它按预期工作。 现在我可以得出结论

  • auto &amp;&amp; 可用于保存(初始化)任何值,OR
  • 我们可以在任何可能的地方使用auto &amp;&amp;

你觉得这种方法有什么缺陷吗?

【问题讨论】:

  • 不要使用自动&&。使用普通类型或 const 引用。除非你实施 move ctor
  • 注:它现在称为转发引用,而不是通用引用。
  • @user3104201 如果我们使用普通类型,它将调用复制构造函数。对于 const 引用,它始终是 const。即使没有移动构造函数,我们也可以拥有 auto && 不是吗?
  • @JonathanWakely 是的,标准是这样说的。

标签: c++ c++11 constants auto forwarding-reference


【解决方案1】:

1) 是的 2) 是的 3) 正如你所说,“个人偏好编码风格”

【讨论】:

  • 你能解释一下你的答案吗?我认为提问者正在寻找支持或反对他建议的指导方针的论据。
  • @jotrocken 1) 'auto&&' 是通用引用,可以绑定到 l- 和 r- 值。我不会总是使用它,但它肯定是可能的。 2) 'const auto&' 是只读引用,您只能在此类对象上使用 const 方法。 3)如果他/她想使用 auto 并让编译器自己推断类型或写下类型,这取决于开发人员。 OP 询问这些陈述是否属实。
  • @paweldac as for 1) 你说,你不会一直使用它,所以你有没有发现任何阻碍它总是使用的缺点(除了不可修改元素)=> 它的速度很快,可以与简单的自动相媲美.. 对吗?
猜你喜欢
  • 2021-09-23
  • 2012-05-29
  • 2016-08-02
  • 1970-01-01
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多