Bisher können alle angebotenen Beispiele für Standardvorlagenparameter für Funktionsvorlagen mit Überladungen erstellt werden.
AraK:
struct S {
template <class R = int> R get_me_R() { return R(); }
};
könnte sein:
struct S {
template <class R> R get_me_R() { return R(); }
int get_me_R() { return int(); }
};
Mein eigenes:
template <int N = 1> int &increment(int &i) { i += N; return i; }
könnte sein:
template <int N> int &increment(int &i) { i += N; return i; }
int &increment(int &i) { return increment<1>(i); }
litb:
template<typename Iterator, typename Comp = std::less<Iterator> >
void sort(Iterator beg, Iterator end, Comp c = Comp())
könnte sein:
template<typename Iterator>
void sort(Iterator beg, Iterator end, std::less<Iterator> c = std::less<Iterator>())
template<typename Iterator, typename Comp >
void sort(Iterator beg, Iterator end, Comp c = Comp())
Stroustrup:
template <class T, class U = double>
void f(T t = 0, U u = 0);
Könnte sein:
template <typename S, typename T> void f(S s = 0, T t = 0);
template <typename S> void f(S s = 0, double t = 0);
Was ich mit folgendem Code bewiesen habe:
#include <iostream>
#include <string>
#include <sstream>
#include <ctype.h>
template <typename T> T prettify(T t) { return t; }
std::string prettify(char c) {
std::stringstream ss;
if (isprint((unsigned char)c)) {
ss << "'" << c << "'";
} else {
ss << (int)c;
}
return ss.str();
}
template <typename S, typename T> void g(S s, T t){
std::cout << "f<" << typeid(S).name() << "," << typeid(T).name()
<< ">(" << s << "," << prettify(t) << ")\n";
}
template <typename S, typename T> void f(S s = 0, T t = 0){
g<S,T>(s,t);
}
template <typename S> void f(S s = 0, double t = 0) {
g<S,double>(s, t);
}
int main() {
f(1, 'c'); // f<int,char>(1,'c')
f(1); // f<int,double>(1,0)
// f(); // error: T cannot be deduced
f<int>(); // f<int,double>(0,0)
f<int,char>(); // f<int,char>(0,0)
}
Die gedruckte Ausgabe stimmt mit den Kommentaren für jeden Aufruf von f überein, und der auskommentierte Aufruf kann nicht wie erwartet kompiliert werden.
Ich vermute also, dass Standardvorlagenparameter "nicht benötigt" werden, aber wahrscheinlich nur in dem Sinne, dass Standardfunktionsargumente "nicht benötigt werden". Wie aus dem Fehlerbericht von Stroustrup hervorgeht, war das Hinzufügen nicht abgeleiteter Parameter zu spät, als dass jemand erkennen und / oder wirklich einschätzen könnte, dass dies die Standardeinstellungen nützlich machte. Die aktuelle Situation basiert also auf einer Version von Funktionsvorlagen, die nie Standard war.