Re: c++0x and rvalue references on gcc 4.6.1

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 09/09/2011 08:23 AM, leon zadorin wrote:
Hi everyone.

Just started looking-into/reading-on c++0x rvalue refs and would like
clarification on the following code being compiled by gcc v 4.6.1 (on
freebsd 8.2 release, amd64):

#include<iostream>
struct init {};
struct x {
   template<typename InitPolicy>
   void
   init_from(InitPolicy const&  x)
   {
     ::std::cout<<  "by ref\n";
   }
   template<typename InitPolicy>
   void
   init_from(InitPolicy&&  x)
   {
     ::std::cout<<  "by rvalue ref possibly stealing resources held by x\n";
   }
};

int
main()
{
   x x1;
   init i;
   x1.init_from(i);
   return 0;
}

compiled with:
c++ -std=c++0x main.cc
produces:
"by rvalue ref possibly stealing resources held by x"

 From various experiments, the above 'x1.init_from(i)' binds as
'x1.init_from<init&>(i)' [as opposed to 'x1.init_from<init>(i)]... but
even if so -- I was wondering how does this correlate with the
following quote from wiki on c++11:
http://en.wikipedia.org/wiki/C%2B%2B0x#Rvalue_references_and_move_constructors
"... A named variable will never be considered to be an rvalue even if
it's declared as such; in order to get an rvalue, the function
template std::move<T>() should be used ..."

I am most likely missing something simple here (just starting to read
no rval refs...)

What you are missing is that the '&&' modifier for an argument to a *template* function has a different meaning than it does for a regular function.

--
Kevin P. Fleming
Digium, Inc. | Director of Software Technologies
Jabber: kfleming@xxxxxxxxxx | SIP: kpfleming@xxxxxxxxxx | Skype: kpfleming
445 Jan Davis Drive NW - Huntsville, AL 35806 - USA
Check us out at www.digium.com & www.asterisk.org


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux