c – 组合两个复制和移动的构造函数

目前,我的一个玩具类模板有两个看起来非常相似的构造函数
optional(const T& x)
{
    construct(x);
}

optional(T&& x)
{
    construct(std::move(x));
}

我可以将它们组合成一个构造函数模板,还是会以某种方式改变语义?

template<typename U>
optional(U&& x)
{
    construct(std::forward<U>(x));
}

解决方法

它改变了std :: is_constructible和std :: is_convertible等特性与可选项交互的方式.例如给出:
class A {};

int main()
{
    std::cout << std::is_constructible<optional<A>,int>::value << '\n';
};

您的原始代码将打印出来:

0

但是你的新代码将打印出来:

1

如果这是不合需要的,并且您仍然想要使用新代码,则可以启用它以将U限制为可接受的类型.

我看到的唯一其他可能的问题是T是否可以是引用类型(例如int&).在这种情况下,原始代码的第二个构造函数看起来很可疑,因为它将传入rvalue,并且您可能试图将该rvalue绑定到非const左值引用(无法确定).如果T永远不能成为引用类型,则无需担心这一点.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...