cppbert schrieb:
> aber trotzdem - warum wird so was nicht verhindern?
Diese Möglichkeit wurde ganz bewusst hinzugefügt, um eben in Templates
nicht unterscheiden zu müssen zwischen Funktionen, die void
zurückliefern und Funktionen, die etwas andres zurückliefern.
Um mal dein Beispiel aufzugreifen:
1 | void blub(){}
|
2 | int blah(){return 0;}
|
3 |
|
4 | template<typename Ret>
|
5 | struct X
|
6 | {
|
7 | Ret test() { return func(); }
|
8 | Ret (*func)();
|
9 | };
|
10 |
|
11 | int main()
|
12 | {
|
13 | X<void> a { blub };
|
14 | X<int> b { blah };
|
15 |
|
16 | a.test();
|
17 | return b.test();
|
18 | }
|
Das würde ohne diese Möglichkeit nicht funktionieren. Man müsste extra
eine Template-Spezialisierung der Klasse schreiben, nur um im Falle von
Ret=void das return in test() wegzulassen.