, исследуя предмет constexpr/оператора "» функций C++ 11, я наткнулся на эту статью: http://www.codeproject.com/Articles/447922/Application-of-Cplusplus11-User-Defined-Literals-tC++ 11 рекурсивная функция лямбда в constexpr оператора «»
Это приводит пример того, как бы, код, обеспечивающий строка-двоичного числа UDL выглядеть:
constexpr unsigned long long ToBinary(unsigned long long x, const char* s)
{
return (!*s ? x : ToBinary(x + x + (*s =='1'? 1 : 0), s+1));
}
constexpr unsigned long long int operator "" _b(const char* s)
{ return ToBinary(0,s);}
все это работает как рекламируется, но я не совсем так, что глобальное пространство имен загрязненным вспомогательного функции ToBinary Вместо того, чтобы пытаться искажать. имя функции Я пытался задумать решение, которое бы имело рекурсивную лямбда-функцию, встроенную в оператор " тело.
Решения для рекурсивных lambdas на C++ известны, и они используют использование std :: function. Чтобы сделать это возможным в операторе constexpr "", нужно было бы иметь объявление и вызов рекурсивной лямбда, встроенной в один оператор возврата. Мои попытки добиться этого не удались, поэтому я обращаюсь к SO за помощью. Имеет ли рекурсивная лямбда, вызванная внутри оператора constexpr "" вообще? Если да, то какие намеки есть?
Благодаря,
Оператор lambda 'operator()' не помечен 'constexpr', поэтому это невозможно. – Xeo
В C++ 11 выражение lambda не может появляться внутри константного выражения (оно может появляться внутри функции constexpr), поэтому вы не можете использовать функцию constexpr в константном выражении, если эта функция имеет лямбда-выражение в оцененном контекст. – dyp
@Xeo 'constexpr int foo (bool p) {return p? 42: []() {return 255; }(); } 'отлично. – dyp