C ++中临时变量和常量之间有什么区别?

时间:2016-03-31 05:12:07

标签: c++ casting const pass-by-reference pass-by-const-reference

请允许我先发布我的代码:

void Fun(short &s){}
void FunCon(const short &s){}

int main()
{
  int iTest = 20;//note: iTest is int but parameter of Fun is "short &"
  Fun(iTest);//error, I know there is a temp variable(typecast)
  FunCon(iTest);//ok
  return 0;
}

我知道Fun(iTest);会生成一个新的 temp变量(类型转换),但我想知道temp变量是否是常量

如果:为什么我不能将temp变量传递给short &

如果:我还有其他代码:

class MyObject{
  public :
  void F(){}
};

MyObject MOCreator(){
  return MyObject();
}

int main()
{
   MOCreator().F();//OK
   return 0;
}

如果MOCreator() 返回的临时变量是常量,为什么 temp变量可以调用非const成员函数

我的问题是:

1) C ++中临时变量常量有什么区别?

2) Thinking in C ++ (第507页)中有一句话。这句话对吗?为什么?:

  

临时对象自动 const

有人要求我提出一个简单的问题,我在解决问题的过程中会遇到更多问题。我知道他们可能是一个非常常见的问题,我在网上搜索很长时间。我也有很多不同的答案。但我现在对此更加困惑。

提前致谢。

3 个答案:

答案 0 :(得分:2)

  

我想知道temp变量是否是常量?

不,它只是一个临时变量,它将在创建它的完整表达式的末尾被销毁。

  

为什么我不能将temp变量传递给short&

临时不能绑定非const引用。但是它可以绑定到const引用,并且临时的生命周期将被扩展以匹配引用的生命周期。这就是为什么FunCon(iTest);没问题。

  

为什么temp变量可以调用非const成员函数?

没关系。唯一特殊的事情是临时变量将在完整表达式的末尾被销毁。

  

这句话对吗?为什么?   临时对象是自动const

没有。除非你明确声明它是const。

答案 1 :(得分:1)

匿名临时值是rvalues,只能绑定到右值引用或const左值引用。因此,您的临时short可以绑定到short&&const short&

他们不是const;右值引用的主要目的是通过将昂贵的复制资源从它们中移出并转换为新对象来改变它们。

答案 2 :(得分:1)

鉴于以下内容:

void f(short& s) {
   s = 42;
}

现在考虑一下这个简单的用例:

short s = 0;
f(s);
std::cout << s << "\n";

这将打印42 - 调用f具有修改s的副作用。

但现在考虑以下内容,如果它是合法的:

int i = 0;
f(i);
std::cout << i << "\n";

这将打印0,因为您在f中修改的内容是临时的,原始的i不受影响。

要防止出现此行为,您只能将临时值传递给const引用或右值引用。