模板构造函数的重载解析
Overload Resolution with Template Constructor?
struct X
{
X(X&); // (1)
X(X&&); // (2)
X(const X&); // (3)
X(const X&&); // (4)
};
考虑所有可能的 X
用法的集合 U,其中这四个构造函数中的一个将被绑定和调度。
例如,U 的一个元素是:
int main()
{
X x1 = ...;
X x2(x1); // <-- (1) used
}
现在假设我们添加第五个构造函数,如下所示:
struct X
{
X(X&); // (1)
X(X&&); // (2)
X(const X&); // (3)
X(const X&&); // (4)
template<class T> X(T&&); // (5)
};
是否有任何新的重载分辨率,其中 U 的一个元素现在将作为更好的匹配调度到(5)
,而不是像以前那样(1)
、(2)
、(3)
或(4)
?
考虑派生类:
struct Y : X
{ Y() { } };
int main()
{
Y y;
X x1(y); // derived class
}
好的,我现在明白了。我想,这种情况适用于任何可转换为 X 的 T。例如:
struct R
{
operator X() const;
};
int main()
{
R r{};
X x{r};
}
如果您的目标是拥有一个仅处理您的 (1( 到 (4( 但不包含其他任何内容的模板构造函数,则必须通过以下方式"消除"其他构造函数:
template <typename T, typename U>
constexpr bool IsSame() {
return is_same<
typename decay<T>::type,
typename decay<U>::type
>::value;
}
struct X
{
template <class T, typename enable_if<IsSame<T, X>()>::type* = 0>
X(T&&);
};
或者,如果您的目标是将 T 的可转换为 X 与其他 T 区分开来,请考虑以下解决方案:
struct X
{
template <
class T,
typename enable_if<is_convertible<T, X>::value>::type* = 0
>
X(T&&); // do something
template <
class T,
typename enable_if<!is_convertible<T, X>::value>::type* = 0
>
X(T&&); // do something else
};
int main()
{
X x2(12); // <-- (5) used
}
(T 被推导为 int(
相关文章:
- 通过 C++ 中的重载构造函数初始化未知类型的变量
- C++将带有重载构造函数的对象添加到另一个对象
- 将重载构造函数传递给类之间的函数
- 使用重载构造函数时出现不完整的类型错误
- 在 if 语句中调用重载构造函数失败
- C++ 具有常量数组和initializer_list的重载构造函数
- C++头/实现文件中的默认和重载构造函数?
- 有没有办法用 2D 数组 (int) 重载构造函数?
- C++重载构造函数问题
- C++:使用结构或枚举重载构造函数之间的区别
- 未调用模板成员的重载构造函数
- 如果我们在c++中重载构造函数,那么默认构造函数是否仍然存在
- 如何为显式重载构造函数启用复制初始化
- 执行重载构造函数的原因和时间
- c++ 在对象组合上使用重载构造函数
- 按参数C++类型专门化重载构造函数
- 具有公共重载构造函数的私有枚举
- 如何处理默认构造函数和重载构造函数之间的歧义
- 变量不会在重载构造函数C++后保持声明状态
- 对重载构造函数 C++ 的不明确调用