const string &str1="test";
string &str2="test";
str1 はコンパイルできるのに、str2 はコンパイルできないのはなぜですか? 理解できません、ありがとう。
std::string&
非 const 左辺値参照 ( など) をテンポラリーにバインドできないという C++ 言語の規則があります。式の RHS は一時std::string
オブジェクトを生成する必要があり、これは にのみバインドできますconst std::string&
。
ユーザー定義の型や変換コンストラクターを含まない、次の単純なコードでも同じエラーが発生します。
int i& = 42;
規則自体は理にかなっています。一時オブジェクトを変更することの意味は何でしょうか? この潜在的に紛らわしい状況に対処しようとする代わりに、言語はそれを完全に禁止しています。もちろん、すべてのルールと同様に、それはあるレベルでは恣意的で実用的な決定であり、広く使用されているコンパイラには、特定の状況下でこのルールを破る「拡張機能」があると聞いています。
std::string const& str = "test";
通常、参照は一時的にバインドできません。文字列の有効期限が切れると、すぐにぶら下がっている参照ができます。ただし、参照はconst
であるため、一時オブジェクトの寿命は参照の寿命まで延長されます。
const
ただし、参照によって返される場合、これの影響を見ることができます。
std::string const& foo()
{
return "Hello World";
}
int main()
{
std::string str = foo(); // runtime error
}
ここでは、代入によって文字列がなくなっているため、 の内部バッファがstr
空のメモリに設定されており、おそらくセグメンテーション違反が発生しています。解決策は、単純に値で返すことです。