在以下代码中,使用&& ;?的优势是什么?
代码来自
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. 🙂
那么,这样做有什么好处?
提供最小化工作解决方案的捷径.当然,这不是一个完整的,生产就绪的代码.