参照 解答ページ | Programming Place Plus Modern C++編【言語解説】 第12章

トップページModern C++編 C++編](../../index.html) – 第12章

Modern C++編は作りかけで、更新が停止しています。代わりに、C++14 をベースにして、その他の方針についても見直しを行った、新C++編を作成しています。
Modern C++編は削除される予定です。

問題①

問題① 次の中から、左辺値参照(const参照でない)で参照できるものを選んでください。


const が付かない左辺値参照で参照できるのは、以下の3つです。

int main()
{
    long int n;
    int a[10];
    struct Data {int a;} data;

    long int& r1 = n;
    int (&r2)[10] = a;
    Data& r3 = data;
}

配列を参照する際には要素数も含める必要があります(本編参照)。

const が付かない左辺値参照で参照できないのは、以下の3つです。

「10.0」と「nullptr」は右辺値なので参照できません。“abc” のような文字列リテラルの型は、const char[] であって(第2章)、これは左辺値ではありますが、const が付いているため const参照でなければ参照できません。
結局のところ、これらはいずれも const参照でならば参照できます。

int main()
{
    const double& r1 = 10.0;
    const char (&r2)[4] = "abc";
    void* const& r3 = nullptr;
}

ポインタへの const参照の記述は少々厄介ですが、書き換えられない constポインタ変数を「const int* const p;」と書く要領で考えてください。ここでは、const にしたいのはポインタではなく参照なので、参照の方に const が付くようにしないといけません。

問題②

問題② 次のプログラムの実行結果を答えてください。

#include <iostream>

int func()
{
    static int n = 0;

    n++;
    return n;
}

int main()
{
    const int& cr = func();
    std::cout << cr << std::endl;

    const int& cr2 = func();
    std::cout << cr << std::endl;
    std::cout << cr2 << std::endl;
}


func関数の戻り値は、静的ローカル変数 n の「コピー」であることがポイントです。戻り値を const参照で受け取っていますが、参照している相手はコピーなので、その後で n の値が変化しても影響を受けません。よって、実行結果は次のようになります。

実行結果:

1
1
2



参考リンク


更新履歴

’2017/8/7 新規作成。



第12章のメインページへ

Modern C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る