C++11引用临时变量的解析
作者:网络转载 发布时间:[ 2015/8/28 11:42:03 ] 推荐标签:测试开发技术 .NET
------------------------------不符合规则1,被规则2处理-----------------------------------------
extern B f();
const A& rca2 = f();// f()返回值是一个类类型的rvalue,
// the cv1 >= cv2: const > 没有修饰符,2.1能够处理
struct X {
operator B();
operator int&();
} x;
const A& r = x;// x 是类类型的
// r 与x 不是reference-compatible的
// x 通过operator B()返回一个类类型的prvalue, tmpB
// r 与tmpB 的关系满足2.1的条件,2.2能够处理
-----------------------不符合规则1,也不符合规则2,被规则3处理---------------------------
const double& rcd2 = 2; // 2,不是一个lvalue/xvalue/类类型的prvalue/函数返回的左值,等。
// 创建一个临时变量2.0,3能够处理
--------不符合规则1,也不符合规则2,也不符合规则3,被规则4处理----------------------
double d2 = 1.0;
double&& rrd2 = d2; // rrd2是一个rvalue reference,不能使用lvalue 赋值。4能够处理
-----------------------------------------其他一些例子-------------------------------------------------------------
const volatile int cvi = 1;
const int& r2 = cvi; // error, in this example, the cv1 <= cv2, which violate the 1.1
*************************回到我们的例子*************************
class Dog
{
public:
Dog(){}
virtual ~Dog(){}
};
void NonConstReference (Dog & dog )
{
//tell the dog to do something here
}
void TestNonConstReference ()
{
NonConstReference( Dog());
}
NonConstReference( Dog())调用,在栈上创建了一个类类型的prvalue。
根据ISO文档,它不能规则1接纳,只能由规则2继续处理。
规则2要求NonConstReference(Dog & dog )中的Dog & dog 必须是const Dog & dog。
而这里显然不是,所以抱错。
************************编译器为我们作了什么?语义分析*****************************
编译器,在严格的按照,c++语言的设计来执行语义检查:
目标是一个lvalue reference, 那么不能给我一个rvalue.
要么把目标设置成const lvalue reference.
如果一个参数是以非const引用传入,c++编译器认为程序在函数中修改这个值,并且想要这个被修改过的值。
但如果你把一个临时变量当作非const引用参数传进来,程序并没有机会继续访问这样的变量,从而使修改一个临时变量变得毫无意义的。
从而c++编译器加入了临时变量不能作为非const引用的这个语义限制,意在限制这个非常规用法的潜在错误。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南