簡體   English   中英

C ++ 17 lambda捕獲具有寬松的類型要求

[英]C++17 lambda captures with relaxed type requirements

我有一個以下代碼,用C ++ 17編譯器編譯但不會用C ++ 14編譯。 我想知道是什么改變,允許下面的代碼編譯:

struct Foo{
  Foo()=default;
  Foo(const Foo&)=default;// copy by const ref 
};

struct Bar{
  Bar()=default;  
  Bar(Bar&)=default; //copy by non const
};

int main()
{
  Foo foo;
  Bar bar;
  Bar barcpy = bar;
  auto foolam = [foo]{};
  auto barlam = [bar]{}; //compiles only with C++17
}

是否有任何關於此代碼編譯的確切建議,或者它是否通過其他一些功能?

保證復制Elision (帶有措辭 )。 這里的lambda實際上是一只紅鯡魚。

在C ++ 14中,這個:

auto barlam = [bar]{};

仍然需要移動構造才有效(即使你不想移動,移動很可能也會被忽略)。 但是這個lambda不是可移動構造的,因為Bar不是可移動構造的。 Foo 是可移動構造的,因此foolam工作正常。

非lambda版本將是:

auto bar = Bar{}; // error in C++14
auto foo = Foo{}; // ok

在C ++ 17中,這不是移動構造 - 我們只是直接初始化目標對象。 從某種意義上說,我們正在忽視此舉。 從不同的意義上說,語言規則根本就沒有任何動作。 所以這:

auto bar = Bar{};

完全等同於:

Bar bar{};

lambda也是如此。

暫無
暫無

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

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