Bu, bağlıdır. İşlevinize bir lvalue aktarıyorsanız (pratikte, bir adı olan ve bir kullanıcı adıyla & adresinin uygulanabileceği bir ad gönderiyorsanız), sınıfınızın kopya kurucusu çağrılır.
void foo(vector<char> v)
{
...
}
int bar()
{
vector<char> myChars = { 'a', 'b', 'c' };
foo(myChars); // myChars gets COPIED
}
sen ve sınıf bir hareket Oluşturucu sahip, daha sonra nesneyi (bir isim ve adres-operatörü & tatbik edilemeyen zorunda değildir kabaca, bir şey) bir rvalue geçiyoruz hareket ettirilecek (bu, dikkat etmeyin, bir "takma ad" oluşturmakla aynıdır, aksine nesnenin bağırsaklarını yeni bir iskelete aktararak, önceki iskeleti işe yaramaz hale getirir). foo()
çağırma olarak
altında
make_vector()
sonucu, bir
rvalue olup.
void foo(vector<char> v);
{
...
}
vector<char> make_vector()
{
...
};
int bar()
{
foo(make_vector()); // myChars gets MOVED
}
Bazı STL sınıfları bir hareket yapıcısı var ama bir kopyası yok: Bu nedenle, döner nesne (yani vector
'ın hareket yapıcı çağrılır) foo()
için girişte verildiğinde taşındıktan olduğunu Oluşturucu, çünkü bunlar doğal olarak gömülebilir olmamalıdır (örneğin, unique_ptr
). Bir işleve ilettiğinizde unique_ptr
kopyasını almayacaksınız.
Bir kopya oluşturucuya sahip olan sınıflar için bile, argümanınızı bir değerden bir değere dönüştürmek için std::move
işlevini kullanarak semantiği hareket ettirmeye zorlayabilirsiniz, ancak yine de bu bir takma oluşturmaz, yalnızca aktarır Nesnenin sahipliğini, çağırmakta olduğunuz işleve. Bu, başka bir değere yeniden tahsis etmekten veya onu yok etmekten başka, orijinal nesneyle başka hiçbir şey yapamayacağınız anlamına gelir. Örneğin
: Eğer lvalue ve rvalue referansların bütün bu konuyu bulup karanlık semantiğini taşırsanız
void foo(vector<char> v)
{
...
}
vector<char> make_vector()
{
...
};
int bar()
{
vector<char> myChars = { 'a', 'b', 'c' };
foo(move(myChars)); // myChars gets MOVED
cout << myChars.size(); // ERROR! object myChars has been moved
myChars = make_vector(); // OK, you can assign another vector to myChars
}
, bu çok anlaşılır bir durum.
http://thbecker.net/articles/rvalue_references/section_01.html
Ayrıca http://www.isocpp.org veya YouTube'a (Scott Meyers tarafından seminer arayın) biraz bilgi bulmak mümkün olmalıdır: Ben şahsen oldukça yararlı bu öğretici buldum.
Tek kolonlarınız ':' çift kolonlu olmamalıdır '::'? – 0x499602D2
@David evet, çift colons olmalıdırlar :: :: –
Kopya geçişini referans olarak önlemek için (tercihen const reference). –