[英]Should we capture by const reference in lambda?
我一直在閱讀Lambda捕獲作為const參考?
這是一個有趣的功能,有時我也希望該功能存在,特別是當我有大量數據需要在lambda函數中訪問時。
我的后續問題-
讓我們假設我們可以。
我們假設[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.