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
in 로 변환 되기 때문 입니다foo(fn1)
. 그런 임시 함수는 rvalue입니다.