作者:羊碧刚_648 | 来源:互联网 | 2022-12-02 12:10
副本在声明中完成:
auto res = Min(o1, o2);
Min()
返回类型是const Obj&
.在auto
上述将被推断为Obj
,不const Obj&
(即,res
类型将是Obj
).res
,它是一个对象,通过复制构造函数(即Obj::Obj(const Obj&)
)初始化,因此发生了复制结构.
如果你改写:
auto& res = Min(o1, o2)
res
将是类型,const Obj&
并且不会在那里进行复制构造,因为res
它将是引用,而不是对象.
1> 眠りネロク..:
副本在声明中完成:
auto res = Min(o1, o2);
Min()
返回类型是const Obj&
.在auto
上述将被推断为Obj
,不const Obj&
(即,res
类型将是Obj
).res
,它是一个对象,通过复制构造函数(即Obj::Obj(const Obj&)
)初始化,因此发生了复制结构.
如果你改写:
auto& res = Min(o1, o2)
res
将是类型,const Obj&
并且不会在那里进行复制构造,因为res
它将是引用,而不是对象.
2> P.W..:
这与auto
推断类型的方式有关:
从CPP工作草案(N4713):
10.1.7.4.1占位符类型推导[dcl.type.auto.deduct]
...
4.如果占位符是自动类型说明符,则使用模板参数推导的规则确定推断类型T'替换T.
和:
17.9.2.1从函数调用中减去模板参数[temp.deduct.call]
...
2.如果P不是引用类型:
...
(2.3) - 如果A是cv限定类型,则顶级类型推导忽略了A类型的cv限定符.
如果P是引用类型,则P引用的类型用于类型推导.
所以auto在下面的声明中
auto res = Min(o1, o2);
推导res
作为Obj
由此进行的分配拷贝构造函数.
所以修改上面这个:
auto& res = Min(o1, o2);
将能够auto
演绎res
为const Obj&
.
但是如果你这样做,res
不能在main中进行修改,因为它是一个const
参考