Please cite chapter and verse from the Standard when making such
assertions. In this case I think you are incorrect ... the rules for
arguments without parameters (5.2.2/7) don't say anything explicit
about the copy constructor.
Not directly, no. Indirectly, yes. If the class/struct has a non-POD
type, the behavior is undefined. To be a POD type, it must be an
aggregate (9/4). To be an aggregate, it must contain no user-declared
constructors (8.5.1/1).
According to 12.8/4, if the class does not declare a copy ctor, one is
declared implicitly. According to 12.8/7, if the copy ctor is
implicitly declared, and the code ever does anything that would use
the copy ctor, then the copy ctor is defined implicitly as well.
Thus, you can pass a POD object, and the implicitly defined copy ctor
will be used to initialize the parameter. That copy-ctor, however,
simply does member-wise copying so you can never tell if it was
invoked (therefore, the as-if rule allows it to be elided without
affecting conformance).
If, OTOH, you want to see whether it has been invoked, you must define
it. As soon as you do so, however, the class/struct is no longer an
aggregate and therefore no longer a POD. Passing it as a variadic
parameter then gives undefined behavior.
You might notice what looks like a corner case there: there are two
separate pieces that say the copy ctor is implicitly declared (12.8/4)
and defined (12.8/7) and you aren't careful, you could read in the
possibility of using an implicit declaration but an explicit
definition of the copy ctor. This is not the case though -- 12.8/7
says the copy ctor IS implicitly defined if it's implicitly declared
and it is ever used.
As such, if the copy ctor is ever used your explicit definition and
the compiler's implicit definition would violate the one-definition
rule.
As far as I can see, that leaves one particularly pointless case: you
can explicitly define the implicitly declared copy ctor if and only if
it is never used. Something to remember if you ever want to write the
world's silliest compiler conformance test suite!
So, this code would generate a compiler error if the banana copy ctor
is private.
If you don't explicitly declare the ctor, it will have an implicitly
declared ctor, which will be public (12.8/5). For the ctor to be
private, it must, therefore, be user-declared. If it's user-declared,
the struct is no longer an aggregate and therefore no longer a POD.
Since that gives undefined behavior, the compiler can legitimately do
whatever it pleases.
Obviously only sheer laziness prevents every C++ programmer from
knowing this. Start by memorizing pages 66 through 203 verbatim and it
follows naturally.