Код: Выделить всё
#include
int data;
using MyFunction = std::function;
template void set(const T& value)
{
data = value;
}
template void set(const MyFunction& f)
{
data = f();
}
int main()
{
set(1); // OK
MyFunction f2 = []() { return 1; }; // OK
set(f2);
auto f1 = []() { return 1; }; // COMPILE ERROR
set(f1);
set([]() { return 1; }); // COMPILE ERROR
return 0;
}
main.cpp: In instantiation of ‘void set(const T&) [with T = main()::]’:
main.cpp:26:8: required from here
main.cpp:10:10: error: invalid user-defined conversion from ‘const main()::’ to ‘int’ [-fpermissive]
10 | data = value;
| ~~~~~^~~~~~~
main.cpp:25:15: note: candidate is: ‘constexpr main()::::operator int (*)()() const’ (near match)
25 | auto f1 = []() { return 1; }; // COMPILE ERROR
< /code>
Пример код включает в себя вареная версия моих попыток. Пробовал C ++ 11, 14, 17, 20 с теми же результатами. MSVC 16 и G ++, аналогичные результаты.
Я надеюсь/ожидаю, что компилятор правильно выведет тип функции Lambda и выберите правильную специализацию.
Подробнее здесь: https://stackoverflow.com/questions/781 ... ument-type
Мобильная версия