1

ベクトルデータを操作する関数をいくつか書いています。

オブジェクトをコピー不可(プライベートコピーコンストラクターと代入演算子)に定義しました。

次に、テンプレート化された演算子を定義しました=

template <typename G>
inline const TMatrix &operator=(const G &gen) {
    ir_mat::Copy<G, Dimension>::start(m_data, gen);
    return *this;
}

この記事で説明されているように、「+」、「*」などのいくつかの追加の演算子。

これで、式の結果をオブジェクトに割り当てることができます。

Vector3f v1, v2, v3;
v1 = v2 + v3;

変数を宣言して1つのステートメントで割り当てることができないのはなぜですか?

Vector3f v1, v2;
Vector3f v3 = v1 + v2;

この割り当ては、変数をインスタンス化する前に一時オブジェクトを作成し、それを新しいオブジェクトにコピーしようとするためですか?一時的なストレージなしで、新しいオブジェクトをインスタンス化するためにも演算子'='を使用できますか?そのための特別なコンストラクターを定義する必要がありますか?

アップデート

また、テンプレート化されたコピーコンストラクターを定義しました(おそらく最も単純な形式で):

template <typename G>
TMatrix(const G &data) {
    operator=(data);
}

これで、v3を次のようにインスタンス化することもできます。

Vector3f v3(v1 + v2);

しかし、他の割り当てではまだ運がありません:

Vector3f v3 = v1 + v2;
4

2 に答える 2

3

=初期化構文を使用してクラスタイプのオブジェクトを初期化する場合はoperator=、を使用せず、コピーコンストラクターを使用します。つまりVector3f v3 = v1 + v2;、と同じVector3f v3(v1 + v2);です。コピーコンストラクターにアクセスできない場合、これを行うことはできません。

operator=は、(のように)すでに構築されているオブジェクトに対してのみ呼び出され、v1 = v2 + v3その形式ではコピー代入T& operator=(const T&)と呼ばれます。

于 2013-02-11T14:39:54.140 に答える
3

この初期化:

 Vector v3(v1 + v2);

素敵なテンプレートコンストラクターを呼び出します。

この初期化:

 Vector v3 = v1 + v2;

これに翻訳されることになります:

 Vector v3(Vector(v1 + v2));

基本的に、コンパイラはコピーコンストラクタを使用しようとします。その際、初期化子を適切な型に変換する方法を理解しようとします。

ランダムタイプから割り当て可能であるが、コピー割り当てまたはコピー構築ができないタイプを作成することを選択することは、非常に奇妙な選択です。一時的なものを避けるためにあなたがそれをしているという私の仮定は正しいと思います。一時的なものは正確に高価であるが、後で評価される式を構築したいという理由でそれを行っていない場合を除きます。おそらく、複雑な式の評価をベクトル化したいからです。

はい、その場合、初期化の割り当て形式を使用することはできません。少なくとも、それを機能させる方法は考えられません。

私の提案は、どういうわけかVector、あなたが構築している表現の単なるハンドルに変身することです。そのハンドルは、入力である実際のベクトルへのハンドルである可能性があります。または、ベクトルを操作した結果であるVectorExpressionへのハンドルである可能性があります。

ハンドルを持っているオブジェクトの所有権を共有したくない場合でも、コピーの割り当てやコピーの作成を実装することはできません。ただし、C ++ 11でも、ムーブ構文とハンドルのムーブ代入を実装できます。

于 2013-02-11T14:49:29.710 に答える