Is safe to use va_start macro with this as parameter?
I think it should be OK, though I doubt you will find a specific citation from the C++ standard which says so.
The rationale is this: va_start()
must be passed the last argument to the function. A member function taking no explicit parameters has only a single parameter (this
), which therefore must be its last parameter.
It will be easy to add a unit test to alert you if you ever compile on a platform where this doesn't work (which seems unlikely, but then again you are already compiling on a somewhat atypical platform).
Seems to be undefined behavior. If you look at what va_start(ap, pN)
does in many implementations (check your header file), it takes the address of pN, increments the pointer by the size of pN and stores the result in ap. Can we legally look at &this
?
I found a nice reference here: https://stackoverflow.com/a/9115110/10316011
Quoting the 2003 C++ standard:
5.1 [expr.prim] The keyword this names a pointer to the object for which a nonstatic member function (9.3.2) is invoked. ... The type of the expression is a pointer to the function’s class (9.3.2), ... The expression is an rvalue.
5.3.1 [expr.unary.op] The result of the unary & operator is a pointer to its operand. The operand shall be an lvalue or a qualified_id.
So even if this works for you, it is not guaranteed to and you should not rely on it.
Nothing specifies that behaviour in the standard, so this construct just invokes formal Undefined Behaviour. That means that it can work fine in your implementation and cause compilation error or unexpected results in a different implementation.
The fact that non static methods have to pass the hidden this
pointer cannot guarantee that va_start
can use it. It probably works that way because in the early times, C++ compilers were just pre-processors that converted C++ source to C source and the hidden this
parameter was added by the pre-processor to be available to the C compiler. And it has probably be maintained for compatibility reasons. But I would try hard to avoid that in mission critical code...