C++ - 函数模板(function template)右值引用参数 问题 及 解决

2014-11-24 02:44:46 · 作者: · 浏览: 2
函数模板右值引用(&&)参数, 存在问题, 由于"&&"双引用符号的歧义性, 和引用崩溃(reference collapse)的原因;
如果不显示(explicit)指定和没有重载, 则函数使用右值引用参数, 既可以传递右值, 又可以传递左值;
传递右值时, 类型正常; 传递左值时, 由于绑定异常(binding exception), 使得T转为类型的引用;
如果是显示指定"int&", 则由于引用崩溃(reference collapse), 使得"int& &&"转换为"int&", 则未类型的引用;
解决方法可以是使用显示指定, 再使用重载参数;
代码如下:
/* 
 * cppprimer.cpp 
 * 
 *  Created on: 2013.11.28 
 *      Author: Caroline 
 */  
  
#include   
#include   
  
template   
void rvfnc (T&& val)  
{  
    T t = val;  
    ++t;  
    if (val == t)  
        std::cout << "rvfnc: this is lvalue." << std::endl;  
    else  
        std::cout << "rvfnc: this is rvalue." << std::endl;  
}  
  
template 
void rvfnc (const T& val) { std::cout << "rvfnc(overload): this is lvalue." << std::endl; } int main (void) { int i(10); rvfnc(i); //左值 rvfnc(10); //右值 rvfnc(i); //如果包含重载则使用重载; 如果不包含, 则使用右值; return 0; }

输出:
rvfnc: this is lvalue.  
rvfnc: this is rvalue.  
rvfnc(overload): this is lvalue.