名前にはスコープ(コンパイル時プロパティ)があり、オブジェクトには存続期間(ランタイムプロパティ)があります。右?
一時的なオブジェクトが「範囲外になる」と話している人をよく見かけます。しかし、一時オブジェクトには名前がないので、この文脈で「スコープ」について話すのは意味がないと思います。一時オブジェクトの存続期間は非常に明確に定義されており、スコープとは関係ありません。同意しますか?
名前にはスコープ(コンパイル時のプロパティ)があり、
はい。私はそれを財産思想とは呼びません。しかし、基本的にはそうです。
一方、オブジェクトには有効期間(ランタイムプロパティ)があります。右?
変数には3つのタイプがあります。各タイプには、寿命に関連して異なるプロパティがあります。
注:自動保存期間オブジェクトには、変数のスコープにバインドされた有効期間があります。
一時的なオブジェクトが「範囲外になる」と話している人をよく見かけます。
変数にバインドされていない限り、式の最後で一時的なものが破棄されます。それらが変数(const参照)にバインドされている場合、それらは変数と同じ寿命を持ちます。これをスコープと呼ぶ方が簡単な場合もありますが、技術的には正しいです。
しかし、一時オブジェクトには名前がないので、この文脈で「スコープ」について話すのは意味がないと思います。
技術的にはそうです。しかし、それはそれについて話すのを簡単にするだけだと思います。私にとって(技術的には正しくありませんが)、一時的な(バインドされていない)スコープは式です。一時変数の寿命よりも簡単に言うことができます。
一時オブジェクトの存続期間は非常に明確に定義されており、スコープとは関係ありません。同意しますか?
はい。ただし、スコープについて話す方が自然な感じがします(技術的に正しくない場合でも)。ほとんどの人があなたが暗示しようとしていることを理解しているように。しかし、あなたが降りて非常に技術的なことについて話すときは、正しい用語を使用する必要があり、この文脈での範囲は正しくありません。
一時的なものの存続期間は構文ブロックとはほとんど関係がありませんが、「スコープ」(技術用語ではなく単語として)は他の方法で使用できます。重要な質問は、人々が一時的なものを指すために「スコープ」を使用するときに混乱するかどうかです。(私のPOVからは、あなたがそうであるようには見えません。)
あなたは他の人とコミュニケーションするためにこの用語を使うことについて話しているので、そのコミュニケーションは本当に重要なことです。標準的なドキュメントを作成することによって用語を定義する場合、または定義された用語のコンテキストでそのようなドキュメントを解釈しようとする場合、状況は異なります。もちろん、ISO 14882の解釈には他の人とのコミュニケーションが含まれるため、その場合は、必要に応じて説明を求める必要があります。
非標準の通信をすべて標準にするのは逆効果であり、高精度が必要な場合はどちらの場合もコードを使用する方がよい場合がよくあります。このため、C++標準では例が広く使用されています。
別の例として、「コンストラクターの呼び出し」がよく使用されますが、技術的にはctorを直接呼び出すことはできません。代わりに、ctorはオブジェクトの初期化の一部です。これが、オブジェクトを構築するためだけに明示的な形式のnewが存在する理由です。(興味深いことに、デストラクタを直接呼び出すことができます。)ただし、標準的なコンテキストでの使用は推奨しませんが、ほとんどのコンテキストでそのフレーズが理解されることを期待します。
「オブジェクトの名前がスコープ外になったときにオブジェクトの存続期間が終了した」という意味で、「オブジェクトがスコープ外になった」と言われるのを見たことがあります。その短い形式を使用する場合、temporayオブジェクトも範囲外になると言うのは自然なことです。
一時オブジェクトには名前がありますが、コンパイラーのみが参照できます。そうでなければ、コンパイラはそれらをどのように参照しますか?インスタンス化された一時を参照できないからといって、コンパイラがそれを参照できないわけではありません。
f(Foo(), Bar());
プログラマーとしてのあなたがどちらも参照できない場合でも、コンパイラーは少なくとも1つの一時を参照する必要があります。一時オブジェクトにはスコープがあります。
const参照へのバインドは、一時的なものの存続期間を参照の存続期間まで延長するため、ある意味で、この特定の場合のスコープと関係があります。
std::string foo();
int main()
{
// Lifetime of the temporary returned by foo is indeed the scope of bar
const std::string &bar = foo();
}
ハーブサッターからのこの記事を参照してください:
通常、一時オブジェクトは、それが現れる完全な式の終わりまでしか持続しません。ただし、C ++は、一時オブジェクトを参照にバインドしてスタック上のconstにバインドすると、一時オブジェクトの有効期間が参照自体の有効期間まで長くなることを意図的に指定しているため、一般的なぶら下がり参照エラーを回避できます。