Re: Trying to understand how function overloading interacts with
 va_list
 
Dan Katz wrote:
void fun1(const char* extra, const char* format, va_list ap) {
    char outString[100];
    vsprintf(outString, format, ap);
    cout << extra << outString << endl; 
}
void fun1(const char* format, ...) {
    va_list ap;
    va_start(ap, format);
    fun1("Extra:  ", format, ap);
    va_end(ap);
}
Don't do that for anything else than testing. The two overloads have 
different semantics.
1) It appears that g++ considers the va_list type to be a (non-const)
   char*.  Is this normal?  Is it standards compliant?  (I didn't see
   anything in the standard that would require it, but I am not a
   language lawyer...)
As far as I know the standard says exactly nothing about the type of 
va_list. But char* is common.
2) It seems that the compiler is treating string literals differently
   from variables which have been defined to be of type "const char*" --
   i.e. in the two invocations of fun1 with the format2 string.  In
   particular, it seems to be doing an implicit conversion from string
   constant to char*, but not from declared "const char*" to char*.  But
   I was under the impression that a string literal is in fact a "const
   char*".  Is there something in the standard that allows them to be
   treated differently in this context?
It is a C compatibility issue. Many older C code does not provide const 
correctness. In C it was allowed to apply modifications to string 
literals unless they are explicitly declared const.
3) Assuming that g++ is being standards compliant, is can anyone suggest
   a better (portable, standards compliant) way to ensure that
      fun1(format2, "arg1", "arg2")
   ends up calling the 
      void fun1(const char* format, ...)
   version of fun1?
Do not overload a function which takes a variable number of arguments 
with a function that does not differ in the non-variable part of the 
argument list. Simply don't do that.
Marcel