I read an article about auto type deduction with decltype and I am wondering if my logic is correct about how type is deduced in the example below (so if I am mistaken please correct me :)
#include <iostream>
using namespace std;
class Widget
{
public:
Widget() = default;
};
int main()
{
Widget w;
const Widget& cw = w; // cw is const Widget&
auto myWidget1 = cw; // (1) myWidget1 is Widget
decltype(auto) myWidget2 = cw; // (2) myWidget2 is const Widget&
}
So far what I understood is that :
for 1 : the auto type deduction is used and in this case it is like temlpate type deduction for parms passed by value. Which means the cv-qualifiers and refs are ignored which will result in Widget as type in the end.
for 2: the decltype is used and then passed to auto what really is cw a const Widget& and then all are set and the type is const Widget&.
So is what I wrote/understood right or wrong ?
Thank you
Here's a trick, so you can make the compiler to print a type:
template <typename>
struct TD;
Then use:
TD<decltype(myWidget1)>();
As TD<...> is an incomplete type, the compiler will complain, and will print your type in the error message:
error: invalid use of incomplete type
struct TD<Widget>
So myWidget1's type is Widget.
Type of myWidget2:
error: invalid use of incomplete type
struct TD<const Widget&>
So its type is indeed const Widget &, as you suspected.
So yes, what you've described is right.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With