7

私は次のコードを試しました:

#include<iostream> 
#include<string>
using namespace std;

string f1(string s)
{
   return s="f1 called";
}

void f2(string *s)
{
   cout<<*s<<endl;
}

int main()
{
   string str;
   f2(&f1(str));
}

しかし、このコードはコンパイルされません。
私が思うのは、f1は値で返されるので、一時的なものを作成し、そのアドレスを取得してf2に渡します。
今、私が間違っていると思っているところを説明してください。

4

4 に答える 4

7

単項演算&は左辺値(または関数名)を取ります。関数f1()は左辺値を返さず、右辺値を返します(何かを返す関数の場合、参照を返さない限り、その戻り値は右辺値です)。そのため、単項&を適用することはできません。

于 2010-06-06T19:25:12.587 に答える
5

自分が何をしているのかを知っていると仮定して、一時オブジェクトへのポインタを作成(および渡す)することができます。ただし、別の方法で行う必要があります。

非参照型の戻り値を持つ関数は、右辺値を返します。C ++では、組み込みの単項演算子&を右辺値に適用することは禁止されています。左辺値が必要です。

つまり、一時オブジェクトへのポインタを取得する場合は、他の方法で取得する必要があります。たとえば、2行のシーケンスとして

const string &r = f1(str);
f2(&r);

キャストを使用して1行に折りたたむこともできます

f2(&(const string &) f1(str));

上記のどちらの場合も、f2関数はパラメーターを受け入れる必要がありconst string *ます。あなたstring *の場合のように、あなたが議論から恒常性を捨てない限り、うまくいきません(それは、ところで、それがすでにあるよりも全体をさらに醜くします)。ただし、メモリが役立つ場合は、どちらの場合も、参照がコピーではなく元の一時的なものに添付されているという保証はありません。

一時オブジェクトへのポインタを作成することはかなり疑わしい方法ですが、明らかな寿命の問題がある場合は、覚えておいてください。通常、それを行う必要はありません。

于 2010-06-06T20:29:41.723 に答える
1

f1パラメータがあり、パラメータを渡していないため、プログラムはコンパイルされません。

さらに、関数から返される値は右辺値であり、そのアドレスを取得することはできません。

于 2010-06-06T19:23:42.340 に答える
0

これを試して:

int main()
{
    string str;
    string str2 = f1(str); // copy the temporary
    f2(&str2);
}
于 2010-06-06T19:45:45.270 に答える