WEB开发网
开发学院软件开发VC VC10中的C++0x特性 Part 2 (3):右值引用 阅读

VC10中的C++0x特性 Part 2 (3):右值引用

 2009-06-10 20:07:36 来源:WEB开发网   
核心提示: Identidy 是做什么用的呢?为什么下面的代码不能工作?template <typename T> T&& Forward(T&& t) { // BROKEN return t;}如果 Forward() 像是上面那样,它就能被隐式调用(不带明确的模板参数),VC10中的

Identidy 是做什么用的呢?为什么下面的代码不能工作?

template <typename T> T&& Forward(T&& t) { // BROKEN
    return t;
}

如果 Forward() 像是上面那样,它就能被隐式调用(不带明确的模板参数)。当我们传给 Forward() 一个 lvalue 实参时,模板参数推导就介入了,如我们前面看到的那样会将 T&& 变成 T&,也就是变成一个 lvalue 引用。问题来了,即使形参 T1&& 和 T2&& 指明是 rvalue 引用,但在 outer() 中,具名的 t1 和 t2 却是 lvaue ,这个问题是我们一直想要解决的!使用上面那个错误的实现, Forward<T1>(t1) 是可以工作的,而 Foarward(t1) 虽然能通过编译(很诱人哦)但会出错,就如它就是 t1 一样。真是痛苦的源泉啊,因此,Identity 被用来阻止模板参数推导。typename Identity<T>::type 中的那对冒号就像绝缘体,模板参数推导无法穿越它,有模板编程经验的程序员应该对此很熟悉了,因为这在 C++98/03 和 C++0x 中是一样的。(要解释这个是另外的事情了)

move 语意: std::move() 是怎样工作的

现在我们已经学习了模板参数推导和引用折叠的特殊规则,让我们再来看看 std::move() :

template <typename T> struct RemoveReference {
     typedef T type;
};

template <typename T> struct RemoveReference<T&> {
     typedef T type;
};

template <typename T> struct RemoveReference<T&&> {
     typedef T type;
};

template <typename T> typename RemoveReference<T>::type&& Move(T&& t) {
    return t;
}

上一页  2 3 4 5 6 7 8  下一页

Tags:VC 特性 Part

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接