簡體   English   中英

如何在 lambda C++ 中模擬結構化綁定初始化捕獲?

[英]How to emulate structured binding init-capture in lambda C++?

在 lambda 中的 init-capture 列表中是否有與結構化綁定等效的東西?

我知道這是無效的,但是有什么方法可以在不聲明 lambda 的情況下聲明 'i' 和 's' 嗎?

std::pair<int, std::string> p { 1, "two" };

auto f = [[i, s] = p] mutable -> std::pair<int, std::string> {
  ++i;
  s += '_';
  return {i, s};
};

auto print = [&]{ 
  const auto& x = f();
  std::cout << x.first << ": " << x.second << '\n';
};

print();
print();
print();

輸出:

1: _
2: __
3: ___

沒有直接做到這一點的語法。

您可以復制該對並在 lambda 中使用結構化綁定:

auto f = [p]() mutable {
    auto& [i, s] = p;
    
    ++i;
    s += '_';
    return std::make_pair(i, s);
};

(請注意,從 C++20 開始,不允許在mutable前面省略() 。)

另外,您也可以使用.first.second直接:

auto f = [i = p.first, s = p.second]() mutable {
    ++i;
    s += '_';
    return std::make_pair(i, s);
};

暫無
暫無

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

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