c – 此代码中\u0026\u0026的优点是什么?

在以下代码中,使用&&amp ;?的优势是什么?
代码来自Specialize same operator for different traits的回答

this问题开始,我得到了&&参数表示它是一个可由函数修改的引用.

decay_t可能会阻止编译器将对变量的引用解释为数组,如What is std::decay and when it should be used?所示

std :: forward是如here所述的完美转发.为什么我们需要这种转发?

谢谢.

#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)
}
最佳答案
实际上,这是一个(让我说)技巧,因为示例代码工作.
事实上,标准说:

A user-declared copy assignment operator X::operator= is a non-static non-template member function of class X with exactly one parameter of type X, X&, const X&, volatile X& or const volatileX&.

此外:

If the class definition does not explicitly declare a copy assignment operator, one is declared implicitly. 

现在,尝试复制 – 为变量分配一个const引用,例如:

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

结果将不再是预期的结果.

无论如何,只要您只处理非cv限定的左值/右值引用,答案中使用的转发引用就可以正常工作,如示例代码所示.
它拦截了一堆特定类型并完成了它的工作.就这样.

正如@ Jarod42的评论中所提到的:

Note that you still have to write the operator=(const A&) to handle it as it is special.

确实没那么特别.如果您没有定义该代码,则该代码中没有正确的复制赋值运算符.
正如评论中所说,定义它

[…] is left as an exercise to the reader. 🙂

那么,这样做有什么好处?
提供最小化工作解决方案的捷径.当然,这不是一个完整的,生产就绪的代码.

转载注明原文:c – 此代码中\u0026\u0026的优点是什么? - 代码日志