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

What is the difference between temporary variable and constant in C++?

请允许我先 post 我的代码:

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);会生成一个新的临时变量(类型转换),但我想知道临时变量是否是常量

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

如果:我还有这样的代码:

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

MyObject MOCreator(){
  return MyObject();
}

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

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

我的问题是:

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

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

Temporary objects are automatically const

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

提前致谢。

I wonder if the temp variable is a constant?

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

Why can't I pass the temp variable to short &

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

why the temp variable can call non-const member function?

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

Is the sentence right? and why?
Temporary objects are automatically const

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

匿名临时对象是右值,只能绑定到右值引用或 const 左值引用。所以你的临时 short 可以绑定到 short&&const short&.

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

鉴于以下情况:

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 引用或右值引用。