Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the difference between returning auto&& and decltype(auto)?

I am trying to make template wrapper function, that should forward parameters and return value. And I can't decide what is better to use auto&& or decltype(auto) for return type. I've read Scott Meyers article and understood that it is necessary to return decltype(auto) compared to auto not to strip ref_qualifiers. As far as I understand the same argument works for using auto&& over auto. Now I have following questions:

  1. Am I right, that there is no difference between decltype(auto) and auto&& when we return reference to object?
  2. What happens if we return rvalue object, like: return int{};? Will return value be dangling reference?
  3. What is the difference between decltype(auto) and auto&&? What better fits as forward return type?
like image 895
mouse_00 Avatar asked Sep 26 '21 13:09

mouse_00


People also ask

What is the difference between auto and Decltype Auto?

'auto' lets you declare a variable with a particular type whereas decltype lets you extract the type from the variable so decltype is sort of an operator that evaluates the type of passed expression.

Can return type be auto?

In C++14, you can just use auto as a return type.


Video Answer


1 Answers

What is the difference between decltype(auto) and auto&&?

decltype(auto) covers three cases. When returning lvalues, the return type would be T& (lvalue-reference); for xvalues, the return type would be T&& (rvalue-reference); for prvalues, the return type would be T (non-reference, i.e. return by-value).

auto&& covers only two cases. When returning lvalues, the return type would be T& (lvalue-reference); for rvalues, including xvalues and prvalues, the return type would be T&& (rvalue-reference). (Forwarding reference is always a reference.)

What happens if we return rvalue object, like: return int{};? Will return value be dangling reference?

For auto&& the return type is rvalue-reference, so yes, the returned reference is always dangling. For decltype(auto) the return type is non-reference then no such trouble.

like image 138
songyuanyao Avatar answered Oct 19 '22 18:10

songyuanyao