Что-то как-то на похмельную голову не соображается))) Код (Text): struct st { int operator () (float) const; }; template <class cmd, class req, class res> void deduce(cmd, res (cmd::*)(req) const = &cmd::operator ()) { } void foo() { st obj; deduce(obj, &st::operator ()); // Тут все хорошо - подсказали о чем речь deduce(obj); // А тут никак - самостоятельно вывести не может :( }
Код (Text): template<class T> void f(T t = int(4)) {}; int main() { f(); //не работает return 0; } Очевидно, типы не выводятся из аргументов по умолчанию. почему - надо курить стандарт, кому не лень это сделать?
"Очевидно", потому что этот пример "не работает" на конкретном компиляторе? По диагностике компилятора нельзя делать выводы об очевидности тех или иных конструкций. 14.8.2.4/17
Ну все, я пришел в себя и мозг снова работает))) Код (Text): struct st { int operator () (float) const; }; template <class cmd, class req, class res> void deduce(cmd, res (cmd::*)(req) const) { } template <class cmd> void deduce(cmd const& c) { deduce(c, &cmd::operator ()); } void foo() { st obj; deduce(obj); }
Мне, например, хватает того, что 'default arguments' не входят в сигнатуру функций, в отличии от 'template-parameters'. На этом поведнии завязано довольно много, в частности сначала происходит вывод типов, а затем невная конвертация значения 'default argument expression' к типу (уже!) выведенного параметра. Если это оганичение будет отсутствовать, то можно напридумывать множество примеров с неясной семантикой. Но это мое мнение, я не знаю реальной причины и состояния стандарта на момент принятия этого ограничения. Может быть оно было принято как результат работы над defect reports, может быть нет...