我正在研究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);
其中ValueType
是typedef T
而ThisType
是typedef 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>
转换为T
,Optional<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&
就足够了。