c++ - std::is_same result with lvalue and rvalue reference -
i playing std::is_same utility function in combination rvalue , lvalue reference , came across weird behavior.
consider function template checks type of variable t.
i using vs 2013 :
struct test {}; template < class t> void h(t && t) { cout << " type &&: " << std::is_same<decltype(t), t &&>::value << endl; cout << " type &: " << std::is_same<decltype(t), t &>::value << endl; }
i observe following outputs :
h(test()); // type && : 1 type & : 0
which normal test() temporary object, , universal reference in parameter of h resolves r value reference (&& && = &&)
but consider :
test mytest; h(mytest); // type && : 1 type & : 1 !!!
same result if write :
test &mytest = test(): h(mytest); // type && : 1 type & : 1 !!!
and same :
test &&mytest = test(): h(mytest); // type && : 1 type & : 1 !!!
am missing ? looks complete mess me :) features rvalue reference / decltype not supported in vs 2013?
thanks help
romain
romain, easy enough. let's condider following case:
test mytest; h(mytest); // type && : 1 type & : 1 !!!
inside h, t test&
, , t of type test& &&
, is, test&
. when test, std::is_same<decltype(t), t &&>
true, since test& &&
test&
, , t
type test&
.
std::is_same<decltype(t), t &>
true, since t
type test&
, , t&
test&&
, test&
.
careful application of reference collapsing rules helps here.
a bit on why inside h() t of type test&
. reason is type of t match actual argument. t can not test
, since test&& not bind(match) lvalue of type test
(as argument type). however, test& &&
will, because of reference collapsing rules.
Comments
Post a Comment