Наткнулся на странное.
Вот простой и понятный код без проблем (?):
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 параметром?