From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) by sourceware.org (Postfix) with ESMTPS id 039843854551 for ; Fri, 18 Nov 2022 21:35:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 039843854551 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmx.at Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmx.at DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.at; s=s31663417; t=1668807327; bh=yizzZ4ZM4tmqbJ1VUtQkoXJiPML7IX1iWrWThU/wJm4=; h=X-UI-Sender-Class:Subject:From:To:Date:In-Reply-To:References; b=HuxR8BdjoKQkar57XS1rdnU7InsYqkKb3GTw9d8vWzU3jojRhsDL3OGjy+pV9rzwf ZcRK5oEcf4D4rscrVxr28rzIc756kuAU9zZ6JjCpiNL28McMGpWIkOPVco7U+Xu23v 1FS3mwmgbiEfkS/FYeSaV92ArEEuPHigptCK1rj0w9KOKEDPa4IgD7uoJDJSnHhVGM knOne0T4d65W1nfj8dRkUw3fBWEujSvFvgJvrpjF2G1TDAc592QZfkuOMWN2HPfWW4 z7Mgoyv7dtFFg2AtYiUXOgNAFHAlWHXSn6drrHyrq/3Fv8QsaRm+5+AXCu9ytERnp6 X0d/9c0n3kkjQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from [192.168.1.3] ([46.57.105.107]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MgNh7-1pR3a40Tfz-00hz9k for ; Fri, 18 Nov 2022 22:35:27 +0100 Message-ID: <32119174b061d5bf07e3d39063709f852ff5ca5f.camel@gmx.at> Subject: Re: Guaranteed copy elision From: Martin Oberzalek To: gcc-help@gcc.gnu.org Date: Fri, 18 Nov 2022 22:35:20 +0100 In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable User-Agent: Evolution 3.44.4 MIME-Version: 1.0 X-Provags-ID: V03:K1:TwVWNrMTV46TByNjZPnidIDfRxbklOLmMvuk4wk6RVuavvNJqWO +i4TsnI+g9J2Fi6jj0MRj2GLUw0KnaSPxRMdJBG4Km2awM8T+6HQJJgXU7xhnpuma2nQUsf qGQnKoZR9X48ypXFH6le18s66A1K5hpAzctgGIuS2G3T0yBI/yhypaZYgnfv9f5jrwIPlU6 yi3m4U2PxsrcSxQxzhTmw== UI-OutboundReport: notjunk:1;M01:P0:Ftdn8s4Udj4=;3stJ/L8mWftGupltNGmKaepcufO MFD1tc3IFxNrc0GuaUwz+LA7Pl9k2e8JelWeqg2Jx8bSUttx98LmHqS9WZLdISqyqQxZR22XZ WD3d43mPhKa8K6AfPWJaVkIMqc7xRAa4T2CqLeUzHsn0wXYBGrBWznGVwsnRPsP6B2SEr7pWX XWzrjCQ2Rl1gTxNewrNNlwlu2JlnIm0LCwuVYbrN7x7bjQGU6iY7g9WlTYzTiSc5ePIxic1hB ql0r+Y57ZxLI5lhNR+4kQ0k9RoHgmfxP69Smm8BpiE4VwB1cqHjqqz+MTFVP5ZJxUY3x7Vxpl AtAaC1q3JWFvh4YgL/t4zlmc4nU96yJJ1TIZm+z86CrnBSV0fxN/L+MVQIsw38OgGDyvxkCUW vyV6HqliwzDzgSZzbeU0M5WSU2wRxSm0FbIEbsKd/h00OKTp2+320mlKXRcpF6OzSp49JcNpw CmtQLuwia9AXUD8Ew/+Dye3nFIk41u+8PZxFBA1626TyvYzfJ5XtvxaEYRtZ4Mc2VhfzeifPa IsW05NnU98CpygbbesU8yv9ei/IDtRajXK75Pq1caDfVpuizl+5e234rlAieZQhmkusMd1Cuo qPbaCR1Khh9XDutBEjUn+g8i7eiS10dJEaIhRSyqI56dAjlJCpmHLLBbudmuPkbu8V8buW6sh cY6YxgEMIW3OqK3zt7wHsgFb0JCFybj0+1O36+O8aoGt7E/ZY2vJjkDc4rzjz3ZXQDYa2GbxX jG9qZpm4nrRObzr8vYO4NattZs2hw90Oj6O4SCmFcH2EzSwmEBeHr9K2XByjqptaZgi9qgukU ti67Yjzr4Ygl249udLbPnWXuILJEQx4q7xFMOIullHKW8sxmNIiO0EqpesH0EptQP4ggkjxj/ d9B403bUE84N6oleuQXncJH2e7L6UQb0TIgtUYv7VBlSmvyaFuGIgqUT9gSwceFR+ea2/eh6v 8TZ3SA== X-Spam-Status: No, score=-1.0 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Am Freitag, dem 18.11.2022 um 16:05 +0100 schrieb Stefan Ring via Gcc- help: > On Tue, Nov 15, 2022 at 6:48 AM Yubin Ruan via Gcc-help > wrote: > >=20 > > To be sure that a object would not be copied, we usually write > > something > > like > >=20 > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 SomeBigObject obj; > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 func(&obj); > >=20 > > while in most of the cases a one-liner like > >=20 > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 SomeBigObject obj =3D = func(); > >=20 > > would suffice. > >=20 > > Is there any language facility to help us guarantee that at compile > > time > > (such as some kind of static_assert() ) so that we can be confident > > writing > > those one-liner ? >=20 > Interesting question, but unfortunately I do not have a good answer! > I > can only bump the thread. ;) With c++ language features this may is a solution: #include #include class DoNotCopy { std::vector myData; =20 public: DoNotCopy( const DoNotCopy & other ) =3D delete; DoNotCopy & operator=3D( const DoNotCopy & other ) =3D delete; // valid move semantic // data within the vector will be moved, not copied DoNotCopy( const DoNotCopy && other ) : myData( other.myData ) {} DoNotCopy() : myData() { } =20 }; DoNotCopy func() { DoNotCopy dnc; return dnc; } int main() { DoNotCopy dnc =3D func(); // works DoNotCopy dnc2 =3D dnc; // error DoNotCopy dnc3; dnc3 =3D dnc; // error }