мы должны иметь возможность использовать его в качестве параметра шаблона.

аяКак мне написать лямбда-выражение, которое выглядит как метод?Я попытался превратить безвоздушную лямбду в указатель на функцию-член, используя тот факт, что, начиная с C ++ 17, безвоздушные лямбда-выражения имеютconstexpr оператор преобразования в их тип указателя функции.

Поэтому я решил проблему, которая сводится к следующему:

template<void(*)()> struct A{};

int main()
{
  A<static_cast<void(*)()>([]{})>{}; // 1

  constexpr auto fp = static_cast<void(*)()>([]{});
  A<fp>{}; // 2
}

Теперь это компилируется в clang (начиная с 5.0.0), но gcc (> = 7.2) жалуется:

error: lambda-expression in template-argument
   A<static_cast<void(*)()>([]{ /*whatever*/ })>{}; // 1
                            ^
error: 'main()::<lambda()>::_FUN' is not a valid template argument for type 'void (*)()' because 'static constexpr void main()::<lambda()>::_FUN()' has no linkage
   A<fp>{}; // 2

Вопрос в том,кто прав?

 Yakk - Adam Nevraumont02 дек. 2017 г., 12:07
Более простой пример использования локальных переменных constexpr должен существовать, не так ли?
 Yakk - Adam Nevraumont02 дек. 2017 г., 15:55
@ Massim не совсем то же самое, но в 3 раза проще. И я могу видеть использование; максимально быстрые делегаты переносной версии.
 cpplearner02 дек. 2017 г., 14:22
Указатель на функцию без связывания должен быть разрешен как аргумент шаблона нетипичного типа в C ++ 17. ВидетьN4198.
 Germán Diago02 дек. 2017 г., 13:36
Я не могу не задаться вопросом, что именно вы пытаетесь сделать и зачем это нужно.
 Massimiliano Janes02 дек. 2017 г., 12:25
@ Якк, готово; хотя это не совсем эквивалентно оригинальному коду ... или нет?

Ответы на вопрос(1)

Решение Вопроса

83258.

В C ++ 14 у нас былотребование связывания для нетиповых параметров шаблона типа указателя. Но в C ++ 17 (в результатеN4268), параметр просто должен бытьпреобразованное константное выражение правильного типа, с некоторыми другими ограничениями (ни одно из которых здесь не актуально). После того, как мы можем построитьfpмы должны иметь возможность использовать его в качестве параметра шаблона.

Ваш ответ на вопрос