C++中特殊的临时变量

C++中特殊的临时变量

C++中产生的临时变量主要产生于计算表达式中间, 函数传参或者返回时候的类型转换中间, 旧一点的书上说在C++中产生的临时变量默认的是const的, 很容易让人产生混乱。先说结论, C++中间的临时变量并不是const的,之所以大家有这样的困惑大概是经常能碰到下面的这段代码:

void f(int &x){}
void g(const int &x){}
int h(){}

int main() {
    //f(h()); // (1) cannot compile
    g(h()); // (2) successfully compile
}

抛开教科书的内容,可以很自然的想到, h()返回了一个临时变量, 如果这个临时变量不是const属性, 编译器为什么要拒绝编译(1)的代码呢, 相反(2)的代码可以成功通过编译。但是紧接着有人举出下面的反例:

struct Foo {
    void f();
}

Foo g(){};
int main() {
    g().f();//g() get a Foo class, which has f() method
}

如果临时变量是const属性的, 那么它怎么可以调用自己的非const的方法呢, 是编译器撒了谎么?
这就是C++中临时变量的特殊性, 它的行为一边像const变量, 一边又像普通变量。其实我这样说本身就有问题, 因为像刚开始说的结论那样, C++中的临时变量本身就不是const属性的,之所以出现第一个例子中的这种情况,是因为语言标准规定:

… C++ doesn’t want you to accidentally modify temporaries, but directly calling a non-const member function on a modifiable rvalue is explicit, so it’s allowed …

意思是不能将临时变量绑定到非const引用上, 如果这样做有可能会改变该临时变量的数据,很多情况下这不是程序员的初衷, 所以禁止这样做。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值