C++ 转发参考上的重载
示例
提供转发参考过载时,您必须非常小心,因为它可能匹配得很好:
struct A {
A() = default; //#1
A(A const& ) = default; //#2
template <class T>
A(T&& ); //#3
};这里的意图是A可复制的,并且我们拥有此其他构造函数可能会初始化其他成员。然而:
A a; //呼叫#1 A b(a); //叫#3!
构造调用有两个可行的匹配项:
A(A const& ); //#2 A(A& ); //#3, with T = A&
两者都是精确匹配项,但是#3引用的cv限定对象比实际的少#2,因此它具有更好的标准转换顺序,并且是最佳的可行函数。
这里的解决方案是始终约束这些构造函数(例如,使用SFINAE):
template <class T,
class = std::enable_if_t<!std::is_convertible<std::decay_t<T>*, A*>::value>
>
A(T&& );这里的类型特征是要从考虑中A公开明确地排除任何类A,这会使该构造函数在前面描述的示例中格式不正确(因此从重载集中删除)。结果,调用了复制构造函数-这就是我们想要的。
热门推荐
5 送蛇的祝福语简短
10 三八简短祝福语给婆婆
11 生日宝宝祝福语简短独特
12 初升高祝福语家长简短
13 生日贺卡祝福语 简短独特
14 宝宝周岁敬酒祝福语简短
15 祝老婆生日祝福语简短
16 初六开工祝福语简短
17 元旦的祝福语简短 公司
18 婚庆花篮祝福语简短大气