Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

template- & copy-c'tor

6 views
Skip to first unread message

Markus Schaaf

unread,
Oct 22, 2019, 11:50:04 AM10/22/19
to
#include <stdio.h>

struct A {
A() {}
template< class E > A( E& ) { fputs( "Ouch!\n", stderr ); }
};

void foo( A ) {}
void bar( A a ) { foo( a ); }

int main()
{
bar( A{} );
}

Ein kleines Programm an dem ich vor einiger Zeit gearbeitet habe,
funktioniert heute plötzlich völlig blödsinnig. Ich konnte das Problem
auf Obenstehendes reduzieren. Ergibt (unerwartet) Folgendes:

[mschaaf@yuna foobar]$ Debug/foo
Ouch!
[mschaaf@yuna foobar]$ gcc --version
gcc (GCC) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
...

Ich bin mir recht sicher, das es früher funktionierte, also den
Compiler-generierten, trivialen Copy-C'tor benutzte. Nun gab es in der
Zwischenzeit einige gcc-Updates, also weiß ich im Moment nicht, seit
wann das so ist. Ich frage hier nur zur Sicherheit, ob ich auf dem
Holzweg bin. Nach meinem Kenntnisstand kann ein Template niemals den
Copy-C'tor ersetzen. Andererseits habe ich keine Lust, das Template
explicit zu machen oder einen Copy-C'tor hinzuschreiben. Kann das an
irgendwelchen Optionen liegen? Damit habe ich leider rumgespielt, weil
mich eine dümmliche Warnung störte, die nicht weg ging.

MfG

Thomas Dorner

unread,
Oct 23, 2019, 1:00:07 PM10/23/19
to
> #include <stdio.h>
>
> struct A {
> A() {}
> template< class E > A( E& ) { fputs( "Ouch!\n", stderr ); }

Dein C'tor template ist nicht const, der default C'tor schon. In Deinen
Funktionen verwendest Du auch nirgends const. Ich bin mir nicht ganz
sicher, aber das könnte schon der Grund sein. Wenn Du Dein E& const
machst, funktioniert es wie erwartet (hier mit G++ 7.4).

> };
>
> void foo( A ) {}
> void bar( A a ) { foo( a ); }
>
> int main()
> {
> bar( A{} );
> }

> Andererseits habe ich keine Lust [...] einen Copy-C'tor
> hinzuschreiben.

Du könntest einfach explizit die Default Implementierung einfordern,
wegen nicht const brauchst Du allerdings beide Varianten:

A(const A&) = default;
A(A&) = default;

Viele Grüße, Thomas

Markus Schaaf

unread,
Oct 23, 2019, 1:50:04 PM10/23/19
to
Am 22.10.19 um 17:25 schrieb Markus Schaaf:

> Holzweg bin. Nach meinem Kenntnisstand kann ein Template niemals den
> Copy-C'tor ersetzen.

Mit clang++ 9.0.0 das Gleiche. Ein "explicit" hilft bei beiden
Compilern. Bin ich der Erste, dem das auffällt? Das muss aber neu sein,
weil man bei einer Suche nach "g++ template copy-constructor" als ersten
Treffer das findet:

g++ doesn't call copy constructor if it is templated?
https://stackoverflow.com/questions/41301384/g-doesnt-call-copy-constructor-if-it-is-templated#41301505

dort mit gcc 6.2.1 und richtigem Verhalten.
0 new messages