Я виявив, що lvalue
лямбда-закриття завжди можна передавати як rvalue
параметри функції.
Дивіться наступну просту демонстрацію.
#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;
}
Випадок 2 - це стандартна поведінка (я просто використовував std::function
для демонстраційних цілей, але будь-який інший тип поводився би так само).
Як і чому працює випадок 1? Який стан fn1
закриття після повернення функції?
std::function
можна вивести з лямбда». Ваша програма не намагається вивести аргументи шаблону std::function
, тому немає проблеми з неявним перетворенням.
std::function
має не явний конструктор, який приймає лямбда-закриття, тому відбувається неявна конверсія. Але в обставинах пов'язаного запитання про шаблонне уявлення std::function
не можна зробити з лямбда-типу. (Наприклад, std::function<void()>
може бути побудований з [](){return 5;}
того, що він має недійсний тип повернення.
fn1
, що неявно перетворюється наstd::function
вfoo(fn1)
. Ця тимчасова функція тоді є релевантною.