Ich hoffe das Thema ist hier angemessen, da ich ja nicht direkt um Hilfe bitte, sondern, wie der Titel schon sagt, eine Quizfrage für euch habe (im Stile von Herb Sutters
Guru of the Week (
siehe auch)). Die Frage stellte sich bei mir tatsächlich, ist also nicht konstruiert (nur simplifiziert natürlich). Also:
Gegeben ist folgender Programmcode:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <iostream> // std::cout
#include <cstddef> // std::size_t
template <std::size_t N>
void foo(char const (&)[N])
{
std::cout << "foo<" << N << ">(char const (&)["<< N << "])\n";
}
void foo(char const*)
{
std::cout << "foo(char const*)\n";
}
int main()
{
foo("bar");
}
|
Beantworte dazu die folgenden Fragen:
- Was bedeutet die Deklaration der ersten Überladung von foo() bzw. welche Argumente nimmt sie entgegen?
- Was gibt das Programm aus (d.h. welche Überladung von foo()wird aufgerufen)?
- Warum ist das so?
- Was muss man am Quellcode verändern um für diesen Aufruf die andere Überladung zu erreichen (ohne irgendein foo() zu entfernen oder inkompatibel zu Argumenten zu machen, zu denen sie vorher kompatibel war)? (Vorsicht bei GCC ≤ 4.7.x!) Begründe!
Bei der letzten Frage (bzw. bei der Begründung von deren Antwort) bin ich mir ehrlich gesagt selbst nicht ganz sicher, da ich nicht so viel Erfahrung im Lesen des Standards habe und würde mich besonders freuen mit euch darüber zu diskutieren.
Tipp: Wer es nicht schon weiß, dem könnte (wie mir) der C++ Standard helfen. Wie man den (manche Entwurfsversionen (hier völlig ausreichend) auch kostenlos) bekommt steht z.B. unter
http://isocpp.org/std/the-standard.
Ich werde die Frage wohl nicht wie bei GotW erst nach einer Woche auflösen, sondern sobald keine Antworten mehr kommen (frühestens am Mittwochabend).
SPOILERWARNUNG: Ihr könnt einfach mit Posts hier im Thread antworten. Das heißt aber, dass ihr beim weiter runterscrollen unweigerlich auf
Antworten die Auflösung stoßen werdet.
Wer das nicht will sollte hier zu scrollen aufhören und den Antwort-Button rechts oben benutzen (und beim Antworten wieder mit dem runterscrollen aufpassen).