1. ホーム
  2. c++

[解決済み] C++で「int& foo()」は何を意味するのか?

2022-09-04 16:38:30

質問

読書中 この説明 を読んでいるとき、これらのコードの行が私の心に残りました。

int& foo();
foo() = 42; // OK, foo() is an lvalue

g++で試してみましたが、コンパイラは"undefined reference to foo()"と表示されます。もし、私が

int foo()
{
  return 2;
}

int main()
{
  int& foo();
  foo() = 42;
}

コンパイルはうまくいくのですが、実行すると セグメンテーションエラー . ただ、この行

int& foo();

はそれ自体で、何の問題もなくコンパイルと実行ができます。

このコードは何を意味するのでしょうか?関数呼び出しに値を割り当てることができますが、なぜrvalueでないのでしょうか?

どのように解決するのですか?

について、何らかの合理的な実装があることを前提に説明しています。 foo への lvalue の参照を返す、妥当な int .

このような実装が考えられます。

int a = 2; //global variable, lives until program termination

int& foo() {
    return a;
} 

さて、このように foo はlvalueの参照を返すので、次のように戻り値に何かを代入することができます。

foo() = 42;

これは、グローバルな a を値 42 という変数があり、この変数に直接アクセスするか、あるいは foo を再度呼び出すことで確認できます。

int main() {
    foo() = 42;
    std::cout << a;     //prints 42
    std::cout << foo(); //also prints 42
}