Лямбда без захвата не будет деградировать до указателя на функцию [дубликат] ⇐ C++
Лямбда без захвата не будет деградировать до указателя на функцию [дубликат]
Вот типичная функция C, которая принимает в качестве аргумента указатель на классическую функцию:
int DoThingy( const char* материал, int(*helper)(int)) { интервал результата = 0; //...вызов помощника... вернуть результат; } Ниже я вызываю вышеописанное с помощью не захватывающей лямбды, которая волшебным образом «деградирует» в указатель на функцию. В «А» преобразование является неявным. В «Б» это явно. Все хорошо.
void UseThingy() { auto lam = [](int)->int { вернуть 42; }; интервал я; я = DoThingy("привет", Лам); //"А" работает int (*ptr)(int) = lam; я = DoThingy("привет", ptr); //"Б" работает } Но в этом новом примере сигнатура функции обратного вызова зависит от типа шаблона:
шаблон int DoThingy2( const char* материал, int (*helper)(T)) { интервал результата = 0; //...вызов помощника... вернуть результат; } Когда я пытаюсь использовать эту версию, как указано выше, строка «C» даже не компилируется. Тем не менее, явная версия «D» работает. Что? Почему это не одно и то же? Обратите внимание, что когда я указываю явный параметр шаблона в «E», это работает, но, конечно, можно вывести из сигнатуры lam, верно? void UseThingy2() { auto lam = [](int)->int { вернуть 42; }; интервал я; я = DoThingy2 («привет», Лам); //"C" не скомпилируется int (*ptr)(int) = lam; я = DoThingy2("привет", ptr); //"Д" работает я = DoThingy2("привет", Лам); //"Е" работает } Следующее также не компилируется, хотя хотелось бы:
i = DoThingy2( "привет", [](int)->int {return 42;}); //"F" не скомпилируется Ранее я должен был сказать, что мне нужно, чтобы параметр функции по умолчанию имел значение 0, чтобы использовалась внутренняя версия helper, когда вызывающая сторона не предоставила ее.
Обратите внимание, что этот вопрос явно отличается от предложенного дубликата. В частности, что касается необязательных аргументов и более того, он имеет лучший набор ответов с использованием функций выбора шаблона C++17.
Вот типичная функция C, которая принимает в качестве аргумента указатель на классическую функцию:
int DoThingy( const char* материал, int(*helper)(int)) { интервал результата = 0; //...вызов помощника... вернуть результат; } Ниже я вызываю вышеописанное с помощью не захватывающей лямбды, которая волшебным образом «деградирует» в указатель на функцию. В «А» преобразование является неявным. В «Б» это явно. Все хорошо.
void UseThingy() { auto lam = [](int)->int { вернуть 42; }; интервал я; я = DoThingy("привет", Лам); //"А" работает int (*ptr)(int) = lam; я = DoThingy("привет", ptr); //"Б" работает } Но в этом новом примере сигнатура функции обратного вызова зависит от типа шаблона:
шаблон int DoThingy2( const char* материал, int (*helper)(T)) { интервал результата = 0; //...вызов помощника... вернуть результат; } Когда я пытаюсь использовать эту версию, как указано выше, строка «C» даже не компилируется. Тем не менее, явная версия «D» работает. Что? Почему это не одно и то же? Обратите внимание, что когда я указываю явный параметр шаблона в «E», это работает, но, конечно, можно вывести из сигнатуры lam, верно? void UseThingy2() { auto lam = [](int)->int { вернуть 42; }; интервал я; я = DoThingy2 («привет», Лам); //"C" не скомпилируется int (*ptr)(int) = lam; я = DoThingy2("привет", ptr); //"Д" работает я = DoThingy2("привет", Лам); //"Е" работает } Следующее также не компилируется, хотя хотелось бы:
i = DoThingy2( "привет", [](int)->int {return 42;}); //"F" не скомпилируется Ранее я должен был сказать, что мне нужно, чтобы параметр функции по умолчанию имел значение 0, чтобы использовалась внутренняя версия helper, когда вызывающая сторона не предоставила ее.
Обратите внимание, что этот вопрос явно отличается от предложенного дубликата. В частности, что касается необязательных аргументов и более того, он имеет лучший набор ответов с использованием функций выбора шаблона C++17.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение