【发布时间】:2016-11-14 10:24:07
【问题描述】:
我研究过auto,我知道它从初始化值中推断出类型。如果我尝试编写一些使用auto 的指南,我可以将以下语句作为规则吗?
- 将
auto &&用于所有可修改的值(右值和左值,因为它是通用参考), -
auto &&即使是只读值, - 尽可能使用
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 &&
getObjgetObjByRefgetObjConst
它按预期工作。 现在我可以得出结论:
-
auto &&可用于保存(初始化)任何值,OR - 我们可以在任何可能的地方使用
auto &&。
你觉得这种方法有什么缺陷吗?
【问题讨论】:
-
不要使用自动&&。使用普通类型或 const 引用。除非你实施 move ctor
-
注:它现在称为转发引用,而不是通用引用。
-
@user3104201 如果我们使用普通类型,它将调用复制构造函数。对于 const 引用,它始终是 const。即使没有移动构造函数,我们也可以拥有 auto && 不是吗?
-
@JonathanWakely 是的,标准是这样说的。
标签: c++ c++11 constants auto forwarding-reference