C++ では 一時変数を const 参照すると一時変数の有効期間が延びる2020年03月12日 12時26分28秒

C++ では一時変数を const 参照で受け取ることが出来る。そして、その場合に、一時変数の寿命はその、const 参照と同じになる。一時変数の寿命は、一般的にはその実行する行だけなのだが、C++ では const 参照を特別に扱う。

実例をあげる。

#include <string>
#include <iostream>

std::string greeting()
{
    return "Hello";
}

int main()
{
    const std::string& good = greeting();
    std::cout << "good " << good << std::endl;
}
greeting 関数は文字列を返し、それを const 参照で受け取っている。
% c++ -std=c++98 const_refernece_string.cpp
% ./a.out 
good Hello
一見 Hello は greeting 関数が戻った後に破棄されてしまうように見える。しかし、その文字列を受け取るのが const 参照なので、延命される。ここで const std::string を使って、複製したものを変更不可にも出来るが、const 参照だと、余計な複製を抑制出来る。

なお、これから const を取ると、しっかりとコンパイルエラーになる。

#include <string>
#include <iostream>

std::string greeting()
{
    return "Hello";
}

int main()
{
    std::string& bad = greeting();
    std::cout << "bad " << bad << std::endl;
}
const を落したのを確認して欲しい。
% c++ -std=c++98 refernece_string.cpp
const_refernece_string.cpp:11:18: error: non-const lvalue reference to type
      'basic_string<...>' cannot bind to a temporary of type 'basic_string<...>'
    std::string& bad = greeting();
                 ^     ~~~~~~~~~~
1 error generated.

次回

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2020/03/12/9223389/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。