0
const string &str1="test";

string &str2="test";

str1 はコンパイルできるのに、str2 はコンパイルできないのはなぜですか? 理解できません、ありがとう。

4

2 に答える 2

11

std::string&非 const 左辺値参照 ( など) をテンポラリーにバインドできないという C++ 言語の規則があります。式の RHS は一時std::stringオブジェクトを生成する必要があり、これは にのみバインドできますconst std::string&

ユーザー定義の型や変換コンストラクターを含まない、次の単純なコードでも同じエラーが発生します。

int i& = 42;

規則自体は理にかなっています。一時オブジェクトを変更することの意味は何でしょうか? この潜在的に紛らわしい状況に対処しようとする代わりに、言語はそれを完全に禁止しています。もちろん、すべてのルールと同様に、それはあるレベルでは恣意的で実用的な決定であり、広く使用されているコンパイラには、特定の状況下でこのルールを破る「拡張機能」があると聞いています。

于 2013-04-27T14:09:32.800 に答える
1
std::string const& str = "test";

通常、参照は一時的にバインドできません。文字列の有効期限が切れると、すぐにぶら下がっている参照ができます。ただし、参照はconstであるため、一時オブジェクトの寿命は参照の寿命まで延長されます。

constただし、参照によって返される場合、これの影響を見ることができます。

std::string const& foo()
{
    return "Hello World";
}

int main()
{
    std::string str = foo(); // runtime error
}

ここでは、代入によって文字列がなくなっているため、 の内部バッファがstr空のメモリに設定されており、おそらくセグメンテーション違反が発生しています。解決策は、単純に値で返すことです。

于 2013-04-27T14:47:34.220 に答える