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

Joe*_*Joe 5 c++ casting constants 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

如果:我有另一个这样的代码:

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

MyObject MOCreator(){
  return MyObject();
}

int main()
{
   MOCreator().F();//OK
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

我的问题是?

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

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

临时对象自动为const

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

提前致谢。

son*_*yao 4

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

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

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

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

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

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

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

不可以。除非你明确声明它是 const。