Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.iso-c++ > #2130 > unrolled thread

template- & copy-c'tor

Started byMarkus Schaaf <mschaaf@elaboris.de>
First post2019-10-22 17:25 +0200
Last post2019-10-23 19:29 +0200
Articles 3 — 2 participants

Back to article view | Back to de.comp.lang.iso-c++


Contents

  template- & copy-c'tor Markus Schaaf <mschaaf@elaboris.de> - 2019-10-22 17:25 +0200
    Re: template- & copy-c'tor Thomas Dorner <td-dclic01@th-dorner.de> - 2019-10-23 18:30 +0200
    Re: template- & copy-c'tor Markus Schaaf <mschaaf@elaboris.de> - 2019-10-23 19:29 +0200

#2130 — template- & copy-c'tor

FromMarkus Schaaf <mschaaf@elaboris.de>
Date2019-10-22 17:25 +0200
Subjecttemplate- & copy-c'tor
Message-ID<qon71l$f66$1@dont-email.me>
#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

[toc] | [next] | [standalone]


#2131

FromThomas Dorner <td-dclic01@th-dorner.de>
Date2019-10-23 18:30 +0200
Message-ID<6elftb5sr2.fsf@th-dorner.de>
In reply to#2130
> #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

[toc] | [prev] | [next] | [standalone]


#2132

FromMarkus Schaaf <mschaaf@elaboris.de>
Date2019-10-23 19:29 +0200
Message-ID<qoq2l3$7ut$1@dont-email.me>
In reply to#2130
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.

[toc] | [prev] | [standalone]


Back to top | Article view | de.comp.lang.iso-c++


csiph-web