簡體   English   中英

是否應該在lambda中通過const引用捕獲?

[英]Should we capture by const reference in lambda?

我一直在閱讀Lambda捕獲作為const參考?
這是一個有趣的功能,有時我也希望該功能存在,特別是當我有大量數據需要在lambda函數中訪問時。

我的后續問題-

  • 是否應該在lambda中通過const引用捕獲? 如果是,應該如何表現?
    (編輯-我也對捕獲變量的生命周期的行為感興趣。)
  • 通過將其引入C ++語法,是否有任何可能的弊端? (我想不到)

讓我們假設我們可以。
我們假設[const &]為要捕獲的語法。

int x = 10;
auto lambda = [const & x](){ std::cout << x << std::endl; }; 
lambda(); // prints 10, great, as expected

x = 11;
lambda(); // should it print 11 or 10 ?

我的直覺是,其行為應與[&]但不應允許更改捕獲的值。

template<typename Func>
void higher_order_function(int & x, Func f)
{
    f(); // should print 11
    x = 12;
    f(); // should print 12
}

void foo()
{
    int x = 10;
    auto c = [const & x] () { std::cout << x << std::endl; };

    c(); // should print 10
    x = 11;
    c(); // should print 11
    higher_order_function(x, c);

    auto d = [const & x] () { x = 13; }; // Compiler ERROR: Tried to assign to const qualified type 'const int &'!
} 
lambda(); // should it print 11 or 10 ?

我不明白為什么要打印10。考慮到lambda只是某些匿名類的實例。 使它成為普通的類,它應該看起來像:

class Lambda {
   public:
      Lambda(const int & i) : i_(i) { }
      void operator()() { std::cout << i_ << std::endl; }
   private:
      const int & i_;
 };

int x = 10;
Lambda lambda(x);
lambda(); // prints 10, great, as expected

x = 11;
lambda(); // should it print 11 or 10 ?

此處const reference的含義僅在於您不能通過i_成員引用變量來修改x


一個簡單的場景:

int x = 10;
const int & crx = x;
x++;
std::cout << crx << std::endl; // prints 11

我一直在想這個問題。
由於默認情況下operator()是const,因此我認為允許const引用也是可以接受的。

使用當前的標准(C ++ 17),我最接近此行為的是:

auto c = [ &x = std::as_const(x) ] () { std::cout << x << std::endl; };

C ++ 11 / C ++ 14中的解決方法是(感謝Daniel的建議):

auto const & crx = x;
auto c = [ &crx ] () { std::cout << crx << std::endl; };

也許不是您想要的東西,但是...我想您可以通過一個通過const引用接收相同值的函數。

如下

template <typename T>
auto make_capture_const (T const & x)
 { return [&x](){ std::cout << x << std::endl; }; }

// ...

int x { 42 };

auto l = make_capture_const(x);

l();

如果您嘗試在lambda內部修改x

std::cout << x++ << std::endl;

你應該得到一個錯誤。

如您所見,通過這種解決方案,您可以知道x不能在lambda內部修改,但是lambda受外部值更改的影響

   int x { 42 };

   auto l = make_capture_const(x);

   l();  // print 42

   x = 43;

   l();  // print 43

恕我直言,假設的[const &]捕獲語法應以相同的方式工作。 但是我知道這是非常值得懷疑的。

暫無
暫無

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

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