可选<t>实现 - 禁用可选(U&amp;&amp;)构造函数

时间:2017-01-28 09:17:58

标签: c++ c++11

我正在研究Optional<T>课程,因为我使用的是c ++ 11而且编译器没有提供实现。我有rvalue引用构造函数的问题。以下构造函数似乎工作正常

Optional();

Optional(const ThisType& other);
Optional(ThisType&& other);

template <typename U>
Optional(const Optional<U>& other);
template <typename U>
Optional(Optional<U>&& other);

template <typename... Args>
explicit Optional(Unused, Args&&... args);
template <typename U, typename... Args>
explicit Optional(Unused, InitializerList<U> initList, Args&&... args);

template <typename U>
Optional(const U& value);

其中ValueTypetypedef TThisTypetypedef Optional<T>。但是,当我尝试实现rvalue reference of U构造函数时:

template <typename U>
Optional(U&& value);

然后以下测试用例不起作用:

// Optional<T>(const Optional<T>&)
Opt o(Unused{});
Opt o2 = o;

编译器尝试使用Optional<T>(U&&)解决此问题,但它当然无法将Optional<T>转换为TOptional<T>Opt且{{1}是} T

Foo

如果我将测试用例从error C2664: 'Foo::Foo(Foo &&)' : cannot convert argument 1 from 'Opt' to 'const Foo &'更改为Opt o(Unused{});,它可以正常工作,但这不是解决方案。

我试图在rvalue构造函数上使用const Opt o(Unused{});而没有运气。我认为我应该在enable_if的类型不是U时启用此功能,但可能我错了。

Optional<U>

修改

可以将以下代码复制粘贴到文件中。我正在使用VS 2013,我仔细检查了这个版本是否正确调用了构造函数。有4行注释template <typename U, typename = typename EnableIf<!IsSame<DecayT<U>, Optional<U>>::Value>::Type> Optional(U&& value); - 如果您注释掉<--- error here构造函数,那些行就可以了。

以下是链接:http://pastebin.com/RLkwF64y

编辑2017-01-30

更新了pastebin链接。

编辑2017-01-30#2

决定放弃Optional(U&&)const U&构造函数。大多数情况下,简单的U&&const ValueType&就足够了。

0 个答案:

没有答案