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

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


本文地址:http://blog.youkuaiyun.com/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.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值