1

私が知る限り、参照はオブジェクトへのアドレスを保持する変数です。したがって、私はこれを理解していません:

#include <iostream>
#include<string>

char* lol[]={"123","abc"};
char* fu(int i){return lol[i];};

int main ()
{
    const string& ru=fu(0);
    lol[0]="567";
    cout<<ru<<endl<<lol[0];
    return 0;
}

出力:

123
567

私は期待していました

567
567

私は ru が lol[0] へのアドレスを持っていることを知っているので、lol[0] を変更したとき、ru はその変更を私に返さなければなりませんでした。なぜそれが起こっているのか誰か説明してもらえますか?

4

3 に答える 3

3

fuを返しますがchar*、これを使用して別の型への参照を初期化しますstring。これはstring、ポインターが参照する文字列のコピーを含む一時的な を作成し、その一時的な参照を初期化することで解決されます。変更lol[0]してもその文字列には影響しません。

pointer への参照が必要な場合は、参照lol[0]fu返す必要がruあり、正しい型への参照である必要があります。

char *& fu(int i){return lol[i];}

char *& ru = fu(0);

(ちなみに、const char *文字列リテラルは定数であるため、 を使用して指す必要があります。への変換char*は歴史的な理由から許可されていましたが、2011 年以降は禁止されています)。

于 2013-11-11T14:31:40.417 に答える
1

期待どおりに動作しません。

const string& ru=fu(0);

暗黙的な型変換を引き起こします。つまり、独自のバッファーを持つ新しい文字列を作成したことを意味します。

Aは astd::stringを参照できません(型に互換性がありません) が、コンパイラは の値のコピーを含むchar*新しい を作成できます。std::stringchar*

于 2013-11-11T14:32:34.593 に答える
0

fu(0)lol[0]それへの参照ではなくコピーを返します。これを試して:

std::vector<std::string> lol = { "123", "abc" };
std::string& fu(int i){ return lol[i]; };

const std::string &ru = fu(0);
lol[0] = "567";
std::cout << ru << std::endl << lol[0];

std::stringC スタイルの文字列から文字列参照を作成することは論理的に不可能であるため、使用が必要です。それらは2つの異なるタイプです。

于 2013-11-11T14:39:02.130 に答える