24

コピーできないクラスがあります。これをコピーすると問題が発生します。コピーされないことを保証したいので、コピー コンストラクターを作成しましたdeleted

class A {
  public:
    A();
    A(const A&) = delete;
};

A fun() {
  return A();
};

int main() {
  A a = fun();
};

残念ながら、g++ は次の理由でこれをコンパイルしません。

t.cc: In function ‘A fun()’:
t.cc:8:12: error: use of deleted function ‘A::A(const A&)’
   return A();
            ^
t.cc:4:5: note: declared here
     A(const A&) = delete;
     ^
t.cc: In function ‘int main()’:
t.cc:12:13: error: use of deleted function ‘A::A(const A&)’
   A a = fun();
             ^
t.cc:4:5: note: declared here
     A(const A&) = delete;
     ^

しかし、これはコピー省略を使用すべき非常に明確な状況であるため、コピー コンストラクターを呼び出すべきではありません。なぜそうなのですか?

4

3 に答える 3

22

C++17 のコピー省略が最適化されるまでは、コンパイラは実行する必要がありません。そのため、コンパイラは (実際にはコピーしない場合でも) コピーする可能性があるため、クラスはコピー可能でなければなりません。C++17 では、多くの場合、コピーの省略が保証されるため、クラスはコピー ctor を必要としません。

以下も参照してください。

http://en.cppreference.com/w/cpp/language/copy_elision

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html

https://herbsutter.com/2016/06/30/trip-report-summer-iso-c-standards-meeting-oulu/ (「保証されたコピー省略」についてのビット)

クラスでコピーコンストラクターを宣言するという古いトリックを使用できますが、実際には実装できませんか? 実際にコピー ctor を呼び出さない限り、これはコンパイラを喜ばせるはずです。私はそれをテストしませんでしたが、C++17 が登場するまではあなたのケースでうまくいくはずです。

于 2016-07-06T13:18:22.690 に答える