0
void fn(string &s)
{
    //....
}

//use the function    
fn("helloworld");

まず、非 const 文字列を const char 文字列で開始するのは間違っています。

パラメータに const を追加すると、コンパイルされます。

しかし、スタック上の一時的なオブジェクト文字列 ("helloworld") を参照するのは正しいでしょうか?

string("helloworld") が呼び出されることは確かですか?

--

編集します。

一時的な文字列が作成された場合、コンパイラは std::string(const char*) のコンストラクターからオブジェクト string("helloworld") が const であるとどのように判断しますか?

4

3 に答える 3

5

しかし、スタック上の一時的なオブジェクト文字列 ("helloworld") を参照するのは正しいでしょうか?

はい、参照が である限りconst、テンポラリーの有効期間は延長されます。

string("helloworld") が呼び出されることは確かですか?

はい、一時は変換コンストラクターを使用して作成されstd::string(const char*)ます。ただし、コンパイラはこのステップ アウトを最適化できることに注意してください。

于 2012-06-26T08:39:55.550 に答える
3

しかし、スタック上の一時オブジェクト文字列( "helloworld")を参照するのは正しいですか?

この場合、おそらくですが、オブジェクトの存続期間に注意を払う必要があります。一時的なものは、完全な表現の終わりに存在しなくなります。ポインタまたはそれfnへの参照を保存すると、問題が発生します。これは通常、あなたのような無料の関数では問題になりませんfn(ただし、問題になる可能性があります)。一時的なものがnew式のコンストラクターへの引数である場合は問題になる可能性があります(ただし、クラスの作成者は、コンストラクターの呼び出しを超える存続期間の要件を文書化する必要があります)。

于 2012-06-26T08:56:51.130 に答える
2

しかし、スタック上の一時的なオブジェクト文字列 ("helloworld") を参照するのは正しいでしょうか?

はい、なぜですか?

string("helloworld") が呼び出されることは確かですか?

はい、 longstringは const char* 引数を使用して暗黙のコンストラクターを提供するため、これは保証されます (std::stringそうします)。

于 2012-06-26T08:42:26.340 に答える