您的位置:首页 > 编程语言 > C语言/C++

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

2013-11-28 15:12 891 查看

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

本文地址: http://blog.csdn.net/caroline_wendy/article/details/17006205
函数模板右值引用(&&)参数, 存在问题, 由于"&&"双引用符号的歧义性, 和引用崩溃(reference collapse)的原因;
如果不显示(explicit)指定和没有重载, 则函数使用右值引用参数, 既可以传递右值, 又可以传递左值;
传递右值时, 类型正常; 传递左值时, 由于绑定异常(binding exception), 使得T转为类型的引用;
如果是显示指定"int&", 则由于引用崩溃(reference collapse), 使得"int& &&"转换为"int&", 则未类型的引用;
解决方法可以是使用显示指定, 再使用重载参数;
代码如下:

/*  * cppprimer.cpp  *  *  Created on: 2013.11.28  *      Author: Caroline  */  #include <iostream> #include <typeinfo>  template <typename T> 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 <typename T> 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<int&>(i); //如果包含重载则使用重载; 如果不包含, 则使用右值;  	return 0; }

输出:

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




本文出自 “永不言弃” 博客,请务必保留此出处http://spikeking.blog.51cto.com/5252771/1387993
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: