3

は私が最初に私のコードをポストすることを許可する:C++の一時変数と定数の違いは何ですか?

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変数は、定数あるかしら知っていますか?

ませんの場合:MOCreator()によって返さ

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

MyObject MOCreator(){ 
    return MyObject(); 
} 

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

場合はtemp変数:私はこのような別のコードを持っている:私はshort &

はい場合に一時変数を渡すことはできませんなぜは定数です。の一時変数は、非constメンバー関数

私の質問は以下のとおりです。

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

2)で考えているのは、C++で考えている(507ページ)です。文章は正しいですか?そして、なぜ?:

一時オブジェクトが自動的にのconst

ある私は、誰かによって、簡単な質問を求め、そして私は質問を解決するための私の方法について多くの質問が発生しました。私は彼らが非常によくある質問かもしれないことを知っています、そして、私はネットで長い時間を探しています。私はまた、多くの異なった答えを得ました。しかし、私は今それについてもっと混乱しています。

ありがとうございます。

答えて

2

私は、temp変数が定数かどうかと思いますか?

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

は、なぜ私は非const参照のためにバインドすることはできません短い&

一時的に一時変数を渡すことはできません。しかし、const参照のためにバインドすることができ、一時的なライフタイムはリファレンスの存続期間に合わせて拡張されます。そのため、FunCon(iTest);は問題ありません。

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

いいです。唯一の特別なことは、完全な式の最後に一時変数が破棄されることです。

文章は正しいですか?なぜ?あなたが明示的にconstのように宣言しない限り
一時的なオブジェクトが自動的にconstの

号です。

+0

"一時的なオブジェクトは自動的にconstです"文章は正しいですか? – Joe

+0

@Joe私はそれのコンテキストを知らない、私はそれがこの単一の文のために間違っていると言うでしょう。 – songyuanyao

+0

@Joe [C++ constの一時オブジェクトは本当ですか?](http://stackoverflow.com/q/4701558/3309790)を参照してください。 – songyuanyao

1

匿名の一時変数は右辺値であり、右辺値参照または右辺値参照にのみバインドできます。したがって、shortは、short&&またはconst short&にバインドすることができます。

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

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"; 

何をfに変更されるだろうことは手つかずの元iで、一時的であるので、これは0を印刷します。

この動作を防止するには、一時参照をconst参照またはrvalue参照に渡すだけです。

関連する問題