rxu*_*rxu 5 c++ universal-reference c++14
在以下代码中,使用的好处是&&什么?该代码来自Specialize相同运算符的不同特征的答案
从这个问题,我得到一个&&参数意味着它是一个可以被函数修改的引用。
的decay_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)
}
Run Code Online (Sandbox Code Playgroud)
实际上,这是一个(让我说)技巧,因此示例代码可以工作。
\n事实上,标准是这样说的:
\n\n\n用户声明的\xc2\xa0copy\xc2\xa0赋值运算符 X::operator=\xc2\xa0 是类\xc2\xa0X\xc2\xa0 的一个非静态非模板成员函数,只有一个类型为\xc2\xa0X 的参数,\xc2\xa0X&,\xc2\xa0const\xc2\xa0X&,\xc2\xa0易失性\xc2\xa0X&\xc2\xa0或\xc2\xa0const\xc2\xa0易失性X&。
\n
而且:
\n\n\n\n\n如果类定义没有显式声明复制赋值运算符,则隐式声明一个复制赋值运算符。\xc2\xa0
\n
现在,尝试将 const 引用复制分配给该变量,例如:
\n\nBb = static_cast<const A&>(Aa);\nRun Code Online (Sandbox Code Playgroud)\n\n结果将不再是预期的结果。
\n\n无论如何,只要您只处理非 cv 限定的左值/右值引用,答案中使用的转发引用就可以正常工作,如示例代码所示。
\n它拦截一堆特定类型并完成其工作。就这样。
正如@Jarod42 的评论中提到的:
\n\n\n\n\n请注意,您仍然需要编写
\noperator=(const A&)来处理它,因为它很特殊。
确实没那么特别。如果您没有定义它,那么该代码中就没有正确的复制赋值运算符。
\n正如评论中所说,定义它
\n\n\n[...] 留给读者作为练习。:-)
\n
那么,这样做有什么好处呢?
\n提供最小可行解决方案的快捷方式。当然,这不是一段完整的、可用于生产的代码。
| 归档时间: |
|
| 查看次数: |
313 次 |
| 最近记录: |