lvalue
Lambda kapaklarının her zaman rvalue
fonksiyon parametresi olarak geçebileceğini buldum .
Aşağıdaki basit gösterilere bakın.
#include <iostream>
#include <functional>
using namespace std;
void foo(std::function<void()>&& t)
{
}
int main()
{
// Case 1: passing a `lvalue` closure
auto fn1 = []{};
foo(fn1); // works
// Case 2: passing a `lvalue` function object
std::function<void()> fn2 = []{};
foo(fn2); // compile error
return 0;
}
Durum 2 standart davranıştır (sadece std::function
gösteri amacıyla a kullandım , ancak başka herhangi bir tür aynı davranır).
Durum 1 nasıl ve neden çalışır? fn1
İşlev döndükten sonra kapanma durumu nedir ?
std::function
bir lambdadan çıkarılan argümanları şablonlayamıyor ". Programınız şablon bağımsız değişkenlerini çıkarmaya çalışmaz std::function
, bu nedenle örtük dönüştürme ile ilgili bir sorun yoktur.
std::function
lambda kapatmalarını kabul eden açık olmayan bir kurucuya sahiptir, bu nedenle örtük dönüşüm vardır. Ancak bağlantılı soru koşullarında, şablonun örneklenmesi std::function
lambda türünden çıkarılamaz. (Örneğin std::function<void()>
, [](){return 5;}
boş olmayan bir dönüş türüne sahip olmasına rağmen inşa edilebilir .
fn1
örtük bir dönüştürülürstd::function
infoo(fn1)
. O zaman bu geçici işlev bir değerdir.