不特定の暗黙的なオブジェクトの作成


9

以来P0593低レベルのオブジェクトの操作のためのオブジェクトの暗黙の作成は、オブジェクトが現在作成され、承認された暗黙的に C ++ 20で。

具体的に提案により導入された文言は、(のような特定の操作が可能にstd::malloc)自動的に特定の種類のオブジェクトの寿命を作成して開始するには、いわゆる暗黙の一生のタイプ場合このようなオブジェクトの導入は持っているそれ以外の場合は未定義の動作でプログラムを引き起こします定義された動作。[intro.object] / 10を参照してください。

ドラフトはさらに、プログラムで定義された動作を与えるために暗黙的に作成できるそのようなオブジェクトの複数のセットがある場合、これらのセットのどれが作成されるかは不特定であると述べています。(関連する文は、私がアクセスできた最後の提案リビジョンR5には存在しないようですが、ドラフトコミットにあります。)

暗黙的に作成されたオブジェクトセットのこの選択が観察可能なプログラムは実際にありますか?言い換えると、この新しいルールを通じて、定義されているが特定されていない動作を伴うプログラムがあり、(複数の可能なオブジェクトのうち)作成された暗黙オブジェクトのタイプのセットを出力から推測できるようになっていますか?

または、この文は、抽象的なマシンでのプログラムの実行を(観察可能な影響なしに)明確にすることだけを目的としていましたか?


2
(OT)暗黙的に作成されたオブジェクトがintの場合、それを「暗黙のint」と呼ぶことができますか?
MM

未指定のセットからの要素の選択がmallocの時点で既知である必要があるかどうかは不明のようです
MM

@MMセットの選択は、実行フロー外のプログラム実行全体の単一の選択として抽象的に発生すると考えられていたと想定しましたが、作成は問題の操作(つまりstd::malloc)で直接発生し、それ以外の場合は定義で問題が発生します将来に応じて再帰的になります。
クルミ

そのトピックについて別の質問、stackoverflow.com / questions / 60627249を作成しました 。もちろん、さらに多くの結果が思い浮かびますが、一度に1つの質問..
MM

この提案はそう区別することが不可能であると主張しています。これは「正しく」選択する方法がないため重要であり、それを回避するための最適化のみが(非常に厳密に)有効であることを意味します。
Davis Herring

回答:


9

標準の例を見て、少し変更してみましょう。

#include <cstdlib>
struct X { int a, b; };
X *make_x() {
  // The call to std::malloc implicitly creates an object of type X
  // and its subobjects a and b, and returns a pointer to that X object
  // (or an object that is pointer-interconvertible ([basic.compound]) with it),
  // in order to give the subsequent class member access operations
  // defined behavior.
  X *p = (X*)std::malloc(sizeof(struct X) * 2); // me: added the *2
  p->a = 1;
  p->b = 2;
  return p;
}

以前は、そのストレージで暗黙的に作成できる有効なオブジェクトのセットは1つだけでしたX。正確に1つでなければなりませんでした。しかし、今では2つXのsのストレージがありますが、そのうちの1つにのみ書き込みます。このプログラムでは、残りのバイトには触れません。したがって、暗黙的に作成される可能性のあるオブジェクトの多くの異なるセットがあります-おそらく2つX、おそらく1 Xつと2つint、おそらく1つとX8つchar...

どのセットが作成されるかは観察できません。実際の観察があった場合、有効なセットのみに可能性が減少するためです。私たちがそのようなことをした場合p[1]->a = 3、可能性の宇宙は2つXのsを持つものに崩壊します。

つまり、暗黙的に作成されたオブジェクトの複数のセットは、プログラムに有効性を区別するための十分な観測がない場合にのみ存在する可能性があります。区別する方法があったとしても、定義上、すべてが有効であるとは限りません。


これはとにかく私の推測です。
バリー

したがって、未定義の動作なしでは、さまざまな暗黙的なライフタイムタイプのオブジェクトの存在または非存在を区別/観察する方法はないと単純に理解しています。その場合、実際には異なる観察可能な結果を​​もたらすことができないのは、標準での「不特定の動作」の唯一の使用であるように私には思えます。
クルミ

1
あるいは、どのような場合にのみアクセスがタイプのglvalues [CV]を経由しているcharunsigned charまたはstd::byte?簡単にコピーできるタイプのオブジェクトもそこに存在する可能性があると思いますか?
aschepler

2
元の例でも、1つのXオブジェクトとともに配列オブジェクトを作成することもできます。
TC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.