bogus error on constructor call with gcc 2.95.2

Martin Sebor sebor@roguewave.com
Sun Oct 15 21:48:00 GMT 2000


Alexandre Oliva wrote:
> 
> On Oct 16, 2000, "E. Jay Berkenbilt" <ejb@ql.org> wrote:
> 
> >     B(A(0, 1));
> 
> This is not what you think it is.  In C++, this is the same as:
> 
>       B A(0, 1);
> 
> i.e., a declaration and definition of a variable named A, of type B,
> initialized using a B's constructor that takes two arguments that can
> be implicitly converted from `0' and `1', respectively.

I respectfully disagree. The above is just what the original poster
said: an expression statement consisting of an unnamed temporary of type
B constructed from another temporary of type A.

>From the grammar:

    simple-declaration:
        decl-specifier-seq[opt] init-declarator-list[opt] ;

    init-declarator-list:
        init-declarator
        init-declarator-list, init-declarator

    init-declarator:
        declarator initializer[opt]

    declarator:
        direct-declarator
        ptr-operator-declarator

    direct-declarator:
        declarator-id
        direct-declarator (parameter-declaration-clause) ...
        direct-declarator [constant-expression[opt]]
        (declarator)

    declarator-id:
        id-expression

B is then the decl-specifier-seq, but (A(0, 1)) can't be an
init-declarator because it's parenthesized (only the declarator can be
parenthesized, not the whole thing). Instead, the whole thing is an
expression-statement.

Regards
Martin

> 
> If you want to construct a temporary, casting it to void or anything
> else that disambiguates the statement so that it is cannot be
> interpreted as a declaration should be fine.
> 
> --
> Alexandre Oliva   Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
> Red Hat GCC Developer                  aoliva@{cygnus.com, redhat.com}
> CS PhD student at IC-Unicamp        oliva@{lsd.ic.unicamp.br, gnu.org}
> Free Software Evangelist    *Please* write to mailing lists, not to me


More information about the Gcc-bugs mailing list