5

次のコードで、を使用する利点は何&&ですか? コードは、Specialize same operator for different traits の回答からのものです。

この質問から、&&引数は、関数によって変更できる参照であることを意味することがわかります。

decay_tstd:: decayとは何ですか

std::forwardhere で説明されているように、完全な転送です。なぜこの転送が必要なのですか?

ありがとう。

#include <iostream>
#include <type_traits>
#include<utility>

class A;

template <typename T>
struct is_A : std::false_type {};
template <> struct is_A<A> : std::true_type {};

template <typename T>
struct is_int : std::false_type {};
template <> struct is_int<int> : std::true_type {};
template <> struct is_int<long> : std::true_type {};

class A{
public:
    int val;

    void print(void){
        std::cout << val << std::endl;
    }

    template <typename T1>
    std::enable_if_t<is_int<std::decay_t<T1>>::value, void>
    operator=(T1 && input){
        val = 2*std::forward<T1>(input);
    }

    template <typename T1>
    std::enable_if_t<is_A<std::decay_t<T1>>::value,void>
    operator=(T1 && Bb){
        val = 5*std::forward<T1>(Bb).val;
    }
};

int main(void){
    A Aa;
    A Bb;
    int in_a = 3;
    Aa = in_a;
    Bb = Aa;
    Aa.print(); //This should give 6. (3x2)
    Bb.print(); //This should give 30. (6x5)
}
4

1 に答える 1

3

実際、これは (私に言わせれば)トリックなので、サンプル コードは機能します。
実際、標準は次のように述べています。

ユーザー宣言のコピー代入演算子 X::operator= は、型 X、X&、const X&、volatile X&、または const volatileX& のパラメーターを 1 つだけ持つ、クラス X の非静的非テンプレートメンバー関数です。

さらに:

クラス定義でコピー代入演算子が明示的に宣言されていない場合は、暗黙的に宣言されます。 

ここで、例として、変数への const 参照をコピーして割り当ててみます。

Bb = static_cast<const A&>(Aa);

結果はもはや期待されたものではなくなります。

とにかく、cv 修飾されていない左辺値/右辺値参照のみを扱う限り、サンプル コードに示すように、回答で使用される転送参照は正常に機能します。特定のタイプの束をインターセプトし、その作業を行い
ますそれで全部です。

@ Jarod42 のコメントで述べたように:

operator=(const A&)それは特別なので、それを処理するにはまだ書く必要があることに注意してください。

それほど特別ではありません。定義しないと、そのコードに適切なコピー代入演算子がありません。
コメントで述べたように、それを定義するには

[...] は、読者への演習として残されています。:-)

それで、それを行う利点は何ですか?
最小限の実用的なソリューションを提供するためのショートカット。もちろん、完全で本番環境に対応したコードではありません。

于 2016-09-16T17:56:33.757 に答える