我了解 C++11 中的转发方法。
template <class T> void foo(T &&)
foo 现在将同时接受左值和右值。
我的问题是当我进一步超载 foo 时。考虑这个简单的代码:
template <class T> class A {};
template <class T> void foo(T &&obj) {}
template <class T> void foo(A<T> &&obj) {}
int main() {
int i;
A<int> a;
foo(i); // calls foo(T &&) as I want
foo(a); // calls foo(T &&), but I want it to call foo(A<T> &&)
return 0;
}
如果我foo
用A < int > &
(左值)对象调用,它将调用foo(T &&)
,而不是foo(A < T > &&)
。在 的定义中foo(T &&obj)
,我设法区分了 std 和自定义特征是否obj
存在A<T>
,但这会产生非常混乱的代码,因为我必须A
从 调用方法obj
,并且obj
声明为T
,而不是声明为A < T >
。重新排序声明或添加左值重载并不能解决问题。
希望我让自己明白。我提供了一个简化的代码来解决问题。我正在实现一个自定义Optional < T >
类(类似于boost::optional
),我在构造函数中遇到了这个问题,因为我需要能够Optional < T >
从另一个Optional < T >
、Optional < U >
或对象创建(T
和分配)一个U
对象。(其中T
是要创建的可选对象所持有的类型,U
是不同的类型,可转换为T
)。
感谢您的时间。