C++ &&;在这个代码中?

C++ &&;在这个代码中?,c++,c++14,universal-reference,C++,C++14,Universal Reference,在下面的代码中,使用&&有什么好处? 代码来自于 从问题中,我得到一个&参数意味着它是一个可以被函数修改的引用 decation\t可能会阻止编译器将变量引用解释为数组,如中所示 std::forward是如上所述的完美转发。为什么我们需要这个转发 谢谢 #include <iostream> #include <type_traits> #include<utility> class A; template <typename T> stru

在下面的代码中,使用
&&
有什么好处? 代码来自于

从问题中,我得到一个
&
参数意味着它是一个可以被函数修改的引用

decation\t
可能会阻止编译器将变量引用解释为数组,如中所示

std::forward
是如上所述的完美转发。为什么我们需要这个转发

谢谢

#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:std::false_type{};
模板结构是_A:std::true_type{};
模板
结构是_int:std::false_type{};
模板结构是_int:std::true_type{};
模板结构是_int:std::true_type{};
甲级{
公众:
int-val;
作废打印(作废){
std::cout实际上,这是一个(让我说)技巧,因此示例代码可以工作。
事实上,该标准规定:

用户声明的复制赋值运算符X::operator=是类X的非静态非模板成员函数,只有一个类型为X、X&、const X&、volatile X&或const volatileX&的参数

此外:

如果类定义没有显式声明复制赋值运算符,则隐式声明一个

现在,尝试复制并将常量引用分配给变量,例如:

Bb = static_cast<const A&>(Aa);
Bb=static_cast(Aa);
结果将不再是预期的结果

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

如@Jarod42的评论所述:

注意,您仍然需要编写
操作符=(const A&)
来处理它,因为它是特殊的

其实没什么特别的。如果不定义复制赋值运算符,代码中就没有合适的复制赋值运算符。
正如评论中所说,定义它

[…]留给读者作为练习。:-)

那么,这样做有什么好处呢?

提供最小工作解决方案的快捷方式。当然,这不是一段完整的、可用于生产的代码。

此代码中的
&&
半正式地称为转发引用。它们绑定到左值和右值,传递给
std::forward
T1
包含有关对象是否被转发的信息最初是左值或右值。简而言之,
&&
的“优点”是它允许完美的转发。所以整个事情就是允许完美的转发…这是否也避免了创建
T1&&Bb
参数任何部分的任何临时副本?@rxu:除非函数(或运算符重载)否则不会创建副本它被转发到按值接收参数(或通过转发引用,然后本身以传递值的方式使用它)。使用
T1&
您也可以在
main
中写入
Aa=3;
,但这不适用于
T1&