+
İfade +[](){}
tekli bir +
operatör. [Expr.unary.op] / 7'de aşağıdaki gibi tanımlanır:
Tekli +
operatörün işlenen aritmetik, kapsamı açık olmayan numaralandırma veya işaretçi tipine sahip olacaktır ve sonuç, argümanın değeridir.
Lambda aritmetik tipte vb. Değildir, ancak dönüştürülebilir:
[expr.prim.lambda] / 3
Tipi lambda ifade [...], benzersiz, isimsiz kaynaşmama sınıf tipidir - adı kapalı tip -, özellikleri aşağıda tarif edilmiştir.
[expr.prim.lambda] / 6
Bir için kapalı tip lambda ekspresyonu hiçbir ile lambda yakalama bir sahiptir public
olmayan virtual
olmayan explicit
const
dönüşüm fonksiyonu işlevi işaretçi kapak tipinin işlev çağrısı operatörü olarak aynı parametre ve dönüş türleri olan. Bu dönüştürme işlevi tarafından döndürülen değer, çağrıldığında, kapanış türünün işlev çağrısı operatörünü çağırmakla aynı etkiye sahip olan bir işlevin adresi olacaktır.
Bu nedenle, tekli +
, dönüşümü bu lambda için olan işlev işaretçi tipine zorlar void (*)()
. Bu nedenle, ifadenin +[](){}
türü bu işlev işaretçi türüdür void (*)()
.
İkinci aşırı yük void foo(void (*f)())
, aşırı yük çözümü sıralamasında bir Tam Eşleşme olur ve bu nedenle açık bir şekilde seçilir (çünkü ilk aşırı yük bir Tam Eşleşme DEĞİLDİR).
Lambda , ve gereksinimlerini karşılayan herhangi bir türü alan, açık olmayan şablon ctoru aracılığıyla [](){}
dönüştürülebilir .std::function<void()>
std::function
Callable
CopyConstructible
Lambda void (*)()
, kapatma tipinin dönüştürme işlevi aracılığıyla da dönüştürülebilir (yukarıya bakın).
Her ikisi de kullanıcı tanımlı dönüşüm dizileridir ve aynı dereceye sahiptir. Bu nedenle ilk örnekte belirsizlik nedeniyle aşırı yük çözümü başarısız oluyor .
Daniel Krügler'in bir argümanıyla desteklenen Cassio Neri'ye göre, bu tekli +
numara davranış belirtilmelidir, yani ona güvenebilirsiniz (yorumlardaki tartışmaya bakın).
Yine de, belirsizlikten kaçınmak istiyorsanız, işlev işaretçisi türüne açık bir dönüşüm kullanmanızı tavsiye ederim: SO'ya ne olduğunu ve neden çalıştığını sormanıza gerek yoktur;)
std::bind
birstd::function
nesneye bağlayabilirsiniz .