я видел использование что-то вродеПочему шаблонная ссылка rvalue принимает значения lvalues?
#include <iostream>
#include <functional>
using namespace std;
template<typename FN>
void Foo(FN&& Fn)
{
Fn();
}
void b()
{
cout << "2." << endl;
}
int main()
{
Foo([](){ cout << "1." << endl; });
Foo(&b);
auto c = []() { cout << "3." << endl; };
Foo(c);
std::function<void(void)> d = c;
Foo(d);
return 0;
}
Я довольно уверен «с» именующий, но я считаю, что есть некоторые дедукции махинация типа лямбды. Но я почти на 100% уверен, d является lvalue.
Почему шаблонный материал работает, если функция принимает значение r, но d является значением lvalue?
Кроме того, почему бы один написать подпись Foo как, что вместо того, чтобы просто
template<typename FN>
void Foo(FN Fn)
Это не действительно rvalue: это называется «универсальная ссылка» (или «ссылка на перемотку», но первая выражает идею лучше) из-за вычитания типа шаблона и списания ссылок. – edmz
@black Правильный термин - «пересылка ссылки» (потому что это, вероятно, должно быть 'std :: forward()' -ed).«Универсальная ссылка» - это то, что использует Скотт Майерс. – Barry