default λ
От: B0FEE664  
Дата: 19.05.16 17:12
Оценка:
Наткнулся на странное.

Вот простой и понятный код без проблем (?):
class A
{
  public:

    template<class TFn>
    bool Fun(int n, TFn fn)
    {
        while(n --> 0) 
        {
            if ( fn(n) )
            {
                return true;
            }
        }
        return false;
    }

    bool Fun(int n)
    {
        return Fun(n, [](int n){ return true; });
    }
};


int main(int argc, char* argv[])
{
    A a;

    a.Fun(8);
    a.Fun(8, [](int n) {return n%2 == 0;});

    return 0;
}


но сначала я его записал так:

class A
{
  public:

    template<class TFn>
    bool Fun(int n, TFn fn = [](int n){ return true; }) // NB
    {
        while(n --> 0) 
        {
            if ( fn(n) )
            {
                return true;
            }
        }
        return false;
    }
};


int main(int argc, char* argv[])
{
    A a;

    //a.Fun(8);// error here
    a.Fun(8, [](int n) {return n%2 == 0;}); // no errors

    return 0;
}


т.е. получается, что default параметр задать можно, но вызов с ним не возможен. Это удивительно. Оно так зачем?

PS я немного подумал и записал так:

class A
{
  public:
 
    bool Fun(int n, auto fn = [](int n){ return true; })
    {
        while(n --> 0) 
        {
            if ( fn(n) )
            {
                return true;
            }
        }
        return false;
    }
 
};
 
 
int main(int argc, char* argv[])
{
    A a;
 
    //a.Fun(8);
    a.Fun(8, [](int n) {return n%2 == 0;});
 
    return 0;
}

И оно, таки, компилируется здесь ...
Хотя ошибка с вызовом a.Fun(8); осталась...

Это что-же получается? Придумали альтернативный синтаксис шаблонных функций? Это стандартизовано будет? И почему не работает вызов с default параметром?
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.