簡體   English   中英

通過右值引用傳遞並使用std :: move()返回?

[英]Pass by rvalue reference and return using std::move()?

考慮:

struct Foo {
    Foo ()                      { std::cout << "default ctor" << std::endl; }
    Foo (const Foo&)            { std::cout << "copy ctor" << std::endl; }
    Foo& operator= (const Foo&) { std::cout << "copy op" << std::endl; return *this; }
    Foo (Foo&&)                 { std::cout << "move ctor" << std::endl; }
    Foo& operator= (Foo&&)      { std::cout << "move op" << std::endl; return *this; }
    ~Foo ()                     { std::cout << "dtor" <<  std::endl; }
};


Foo process1 (Foo&& foo) {
    return foo;
}


Foo process2 (Foo&& foo) {
    return std::move (foo);
}

和用法:

Foo foo {};
foo = process1 (std::move (foo));

給出結果:

default ctor
copy ctor
move op
dtor
dtor

和用法:

Foo foo {};
foo = process2 (std::move (foo));

給出結果:

default ctor
move ctor
move op
dtor
dtor

首選哪一個(process1或process2)?

這是否意味着在第一個示例(process1)中,如果我通過右值引用將對象傳遞給該函數,該函數返回一個Object,如果我不使用std::move() ,將進行復制?

編譯器:GCC 5.2.1

在第一個版本中

Foo process1 (Foo&& foo) {
    return foo;
}

您將其作為右值引用傳遞,但是通過“如果它具有名稱”試探法 ,它將在函數中被視為左值,因此被視為復制ctor。

第二個版本使用std::move “重制”它為一個右值(這正是它的目的)。 因此避免了復制控制器。

可以預期,遷移的成本不會比復制的成本高,因此,考慮到現實生活中的情況,您可能更喜歡第二個版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM