5

最初に私のコードを投稿させてください:

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 変数を渡せないのはなぜですか?short &

はいの場合: 次のような別のコードがあります。

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

MyObject MOCreator(){
  return MyObject();
}

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

によって返される一時変数MOCreator() が定数の場合、一時変数が非定数メンバー関数を呼び出すことができるのはなぜですか?

私の質問は:</p>

1) C++の一時変数定数の違いは何ですか?

2) Thinking in C++ (page 507)に一文があります。文は正しいですか?なぜ?:

一時オブジェクトは自動的にconstになります

誰かから簡単な質問をされましたが、その質問を解決する途中でさらに質問に遭遇しました。私はそれらが非常に一般的な質問である可能性があることを知っており、ネットで長い間検索しています. また、さまざまな回答をいただきました。しかし、私は今それについてもっと混乱しています。

前もって感謝します。

4

3 に答える 3

4

一時変数は定数なのだろうか?

いいえ、それは作成された完全な式の最後で破棄される単なる一時変数です。

temp 変数を short & に渡せないのはなぜですか?

非 const 参照にテンポラリをバインドすることはできません。ただし、const 参照にバインドされる可能性があり、参照の有効期間と一致するように一時的な有効期間が延長されます。だからFunCon(iTest);いいんです。

一時変数が非 const メンバー関数を呼び出すことができるのはなぜですか?

大丈夫だよ。唯一の特別な点は、完全な式の最後で一時変数が破棄されることです。

文は正しいですか?なぜ?
一時オブジェクトは自動的に const になります

いいえ。 const であると明示的に宣言しない限り。

于 2016-03-31T05:25:47.727 に答える
1

const匿名一時変数は右辺値であり、右辺値参照または左辺値参照にのみバインドできます。したがって、一時的なものは aまたは ashortにバインドできます。short&&const short&

そうではありませんconst。右辺値参照の主な目的は、コピーにコストがかかるリソースを右辺値参照から新しいオブジェクトに移動して変更することです。

于 2016-03-31T05:29:15.067 に答える