- 主题:unique_ptr 和auto &&
q 应该是个std::unique_ptr<int>&
--
FROM 122.224.174.*
也不能说auto&&就是perfect forward
&&是perfect forward的情况是
template<class T>
xxx(T&& )
的情况
他这段代码里auto是decltype,他右边是个unique_ptr,所以唯一能编译通过的auto&& decltype出来是unique_ptr&
【 在 here080 的大作中提到: 】
: 这里不是decay
: auto&&就是完美forward
: 接受的是什么它就是什么。
: ...................
--
FROM 122.224.174.*
我的理解是auto是decltype的语法糖
int *p=new int(1);
const auto &q=p; // int * const q=p
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
你这个例子不太合适,我的理解是,q这个时候是个const int*&。
更合适和常见的例子是
std::vector<A> a_vec;
for( const auto& elem : a_vec )
{
xxxx
}
在这个例子里,如果用const auto elem : a_vec,编译器会把auto解释为cosnt A,所以每个elem是一个copy,而如果显示用了const auto& elem,等于告诉编译器,你这儿每个elem是一个reference。 因为&&会引发decay,所以除非你的auto类型在函数的input里,然后在代码里,又有明显的地方表示除非auto&&是个rvalue,不然编译不过,不然编译器不会认为auto&&是个rvalue.
理解不对的地方请版上各位指正。
【 在 lushan5436 的大作中提到: 】
: o,
: 这个auto,我很多地方容易费解。正常这个&&只能用于 右值,但auto&&却用于了左值
: 还有类似的
: ...................
--
FROM 122.224.174.*
可能我读到的文献里perfect forward仅仅只forward函数的input。
需要perfect forward的情况是expression同时有
expression(const A& a)
expression(A&& a)
然后在forward call的时候,compiler需要deduct具体呼叫哪个,因为是个模板
template<class T>
wrapper(T&& a)
但是
foo()的return type永远是lvalue
就算
auto&& x = foo();
expression(x)
呼叫的也是expression(const A& a),如果需要呼叫expression(A&& a),需要
expression(std::move(x))
【 在 here080 的大作中提到: 】
: perfect forward不就是这个意思?
:
--
FROM 122.224.174.*
我的意思就是函数的return type不可能是rvalue,
所以你在这儿不存在forward,因为永远都是lvalue
forward,只有在从input传input才叫forward
&&会触发decay deduction,但是只有应用在input到input的情况下才叫forward
在auto&& a = none_copyable<A> 的情况下,不是decay,因为opertor=(cosnt unique_ptr&) = delete, 也不是forward,我能想到的只有词只有decltype
【 在 here080 的大作中提到: 】
: 如果foo()返回的是左值,不管用wrapper还是auto&&都会match到const A&啊
:
--
修改:ziqin FROM 122.224.174.*
FROM 122.224.174.*
编译不过去的代码我觉得不存在,但是,他最开始的例子,也是他产生迷惑的地方:
auto p = std::make_unique<int>(7);
auto&& q=p;
你认为第二行的auto&& q = p;是一个函数呼叫吗?
operator=(const unique_ptr& ) = delete
unique_ptr(const unique_ptr& ) = delete
所以第二行就不是一个函数呼叫,如果按auto&& 左边的就是右边的简单理解,那p是一个unique_ptr,q是一个unique_ptr&,明显是不一样的
【 在 here080 的大作中提到: 】
: 你就说我认为的等价关系是否存在吧?
: 或者说你举个例子说明不同代码间的区别吧。
: 你强调这个没有意义。
: ...................
--
修改:ziqin FROM 122.224.174.*
FROM 122.224.174.*