I thought it would be interesting to discuss a subtle C/C++ interview question I learned recently. Question is deceptively simple: "Can you write a return statement in a function that returns void?" The answer is "Yes! You can return void!" The following program seems to be a valid C/C++ program.
static void foo (void) { }
static void bar (void) {
return foo(); // Note this return statement.
}
int main (void) {
bar();
return 0;
}
I tested it using gcc4 and VS9. With -ansi and -pedantic compiler options for gcc, it throws just a warning pointing at line #5.
return_void.c:5: warning: return with a value, in function returning void
Although use of such a feature is not clear in a C program, it is particularly useful while using templates. Consider,
template <class T>
T FOO (void) {
return T(); // Default construction
}
template <class T>
T BAR (void) {
return FOO<T>(); // Syntactic consistency. Same for int, void and everything else.
}
int main (void) {
BAR<void>();
}
It suddenly makes sense when templates are in picture. Take home point: Syntactic consistency is of paramount importance for supporting generic programming and writing generic libraries.
static void foo (void) { }
static void bar (void) {
return foo(); // Note this return statement.
}
int main (void) {
bar();
return 0;
}
I tested it using gcc4 and VS9. With -ansi and -pedantic compiler options for gcc, it throws just a warning pointing at line #5.
return_void.c:5: warning: return with a value, in function returning void
Although use of such a feature is not clear in a C program, it is particularly useful while using templates. Consider,
template <class T>
T FOO (void) {
return T(); // Default construction
}
template <class T>
T BAR (void) {
return FOO<T>(); // Syntactic consistency. Same for int, void and everything else.
}
int main (void) {
BAR<void>();
}
It suddenly makes sense when templates are in picture. Take home point: Syntactic consistency is of paramount importance for supporting generic programming and writing generic libraries.
Comments
I come from a Java background and have only begun to recently write C++ API's and I realize that the modern C++ way of doing things (generic programming) is just *so* totally different from OOP.
It's no wonder that people find it obtuse. :)
In particular, do you have a iso14882 reference for this?
And you can't even overload the function template that hides this, so I had to make another N overloads to hide that again.
Too bad they didn't pull this through all the way.
Anyway, I will blog on this topic here:
http://advancedcppwithexamples.blogspot.com/