2

C++ では、一時オブジェクトを const 参照にバインドできます。

struct A {};

int main() {
  const A& a = A();
}

特定のクラス A に対してこれを無効にして、このクラスの一時を const 参照にバインドできないようにする方法はありますか?

4

2 に答える 2

6

いいえ、これを行う必要がある場合は、他の何かが間違っています。

于 2012-12-11T15:56:56.617 に答える
2

一般に、const参照への一時的なバインドを無効にする方法はないようです。

ただし、実証された答えを与えるために、C++2003標準を引用したいと思います。

初期化式が右辺値であり、T2がクラス型であり、「cv1T1」が「cv2T2」と参照互換である場合、参照は次のいずれかの方法でバインドされます(選択は実装定義です)。

—参照は、右辺値(3.10を参照)で表されるオブジェクト、またはそのオブジェクト内のサブオブジェクトにバインドされます。

—タイプ「cv1T2」[原文のまま]の一時オブジェクトが作成され、コンストラクターが呼び出されて、右辺値オブジェクト全体が一時オブジェクトにコピーされます。参照は、一時または一時内のサブオブジェクトにバインドされます。93)

コピーを作成するために使用されるコンストラクターは、コピーが実際に実行されるかどうかに関係なく呼び出し可能でなければなりません。

したがって、これは、コピーコンストラクターをプライベートにすることでC++03で実現できるように見えるかもしれません。

struct A {
  A() {}
 private:
  A(const A&);
};

int main() {
  const A& a = A();
}

ただし、これは一般的なコンパイラでは機能しません。たとえば、GCCは-std=c++03フラグがあっても上記のコードを受け入れます。Clangもこのコードを受け入れますが、警告があります。

test.cc:8:12:警告:C ++ 98では、参照を一時的なものにバインドするときに、クラス'A'のアクセス可能なコピーコンストラクターが必要です。プライベートだった

したがって、標準に反して、これを行う方法はありません。

この場合、C++11はアクセス可能なコピーコンストラクターを必要としなくなりました。

于 2012-12-16T05:56:33.990 に答える