Re: BSD Unix: Weird call to structure constructor in formatter.h
Alf P. Steinbach wrote:
* James Kanze:
Alf P. Steinbach wrote:
Essentially the (rather silly) assumption is that "can be called without
an argument", in the definition of default constructor, refers to some
generated call, and crucially, /not/ to a source code expression, i.e.
it doesn't refer to the form of the program text.
That's what the sentence says. I don't see how it can possibly
be read otherwise.
One way to read it is that a default constructor is one that can be
called by a source code construct with no arguments, primary examples
being 'T();' (an explicit call) and 'T x;' (an implicit call).
Which is what I said. Except that I consider both of your
examples implicit calls. Any time the compiler needs to call
the constructor with no arguments, it is the default constructor
which gets used.
That assumption [of no source code reference] yields a contradiction.
Most readers will already have understood the contradiction (a
definition that doesn't refer to program text, to my mind it requires no
further explanation),
Why. We have lots of definitions which don't refer directly to
program text, and apply to many different forms of program text.
Because if the definition does not refer to program text, then it refers
to something /undefined/ choose-as-you-will that is not program text.
It refers to what the program does. A constructor is a defined
concept in the standard. You can't just redefine it to do
whatever you want.
but just to flesh this out:
Consider the T default constructor
T( int x = 0 ) {}
Assuming translation to machine code, if the compiler can generate a
call without an argument, then either the assumed generated call is (A)
a call that has no machine code argument, or (B) a call that corresponds
to a source code expression with no source code argument.
You're loosing me.
It's called a 'dilemma'.
I don't see it. I don't care about machine code; the standard
doesn't, either. Maybe if we tried to speak in terms of the
abstract machine, which serves to define the semantics of a
program in the standard? I don't know.
The problem is that I don't see any relevance in what you are
saying to the problem at hand.
The idea is that if you accept the simple
facts and simple logic of the dilemma, but uphold your stated position,
then you must choose one horn of the dilemma, and impale yourself on
that horn. One way out is to dispute the facts; another, to dispute the
logic; a third, to show that there is more than two horns, e.g. a little
one in the middle that one can easily step over without harm; a fourth
is to opt out, e.g. to pretend to not understand the dilemma or simply
walk away; and a fifth, the one I hoped for, saying "right, my
assumptions/whatever lead to a contradiction, they can't be correct".
The problem is that you are talking about things which as far as
I can see have no connection what so ever with the question.
The standard doesn't talk about machine code; it talks about
calling the constructor. And at the machine code level, there's
no such thing as a constructor; it's just a sequence of machine
instructions. A constructor is something defined by the
standard. It does a certain number of things. Calling it
results in those things being done. If something less is done,
then the constructor hasn't been called. If something more is
done, then more than just calling the constructor has taken
place.
What I'd really like to know is what you consider "explicitly
calling the constructor". I know that constructors get called;
I wouldn't bother writing them otherwise. Above, you've said
that "T()" explicitly calls the constructor, and "T x;"
implicitly calls it. I would say that both are identical: they
both create an object of type T, i.e.: they allocate the memory
for the object, then initialize it. Initializing an object of
class type implicitly calls the constructor. The only semantic
difference between the two constructs, above, is in the lifetime
of the created object. Syntactically, "T()" looks superficially
like a function call, but as we all know, to understand C++
syntax, you have to know whether a symbol is the name of a type
or not, and that information often changes the syntactic meaning
of the construct. So what makes "T()" an explicit constructor
call?
I'm curious, in fact. If "T()" is an explicit constructor call,
what about "T(a)" (where T is a type name, and a a variable)?
Even in the following:
class T { } ;
class U { public: operator T() { return myT ; } ; T myT ; } ;
void f( T const& ) ;
void g()
{
U u ;
f( T( u ) ) ;
}
I don't think you can go on syntax along.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient?e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S?mard, 78210 St.-Cyr-l'?cole, France, +33 (0)1 30 23 00 34
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]