Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.iso-c++ > #2130 > unrolled thread
| Started by | Markus Schaaf <mschaaf@elaboris.de> |
|---|---|
| First post | 2019-10-22 17:25 +0200 |
| Last post | 2019-10-23 19:29 +0200 |
| Articles | 3 — 2 participants |
Back to article view | Back to de.comp.lang.iso-c++
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
| From | Markus Schaaf <mschaaf@elaboris.de> |
|---|---|
| Date | 2019-10-22 17:25 +0200 |
| Subject | template- & 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]
| From | Thomas Dorner <td-dclic01@th-dorner.de> |
|---|---|
| Date | 2019-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]
| From | Markus Schaaf <mschaaf@elaboris.de> |
|---|---|
| Date | 2019-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