トップページ – Modern C++編 C++編](../../index.html) – 第12章
問題① 次の中から、左辺値参照(const参照でない)で参照できるものを選んでください。
const が付かない左辺値参照で参照できるのは、以下の3つです。
int main()
{
long int n;
int a[10];
struct Data {int a;} data;
long int& r1 = n;
int (&r2)[10] = a;
& r3 = data;
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;
++;
nreturn 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
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |