7

私はこれを以前は知りませんでしたが、次のことがわかりました。

[C++11: 3.7.5]:メンバー サブオブジェクト、基底クラス サブオブジェクト、および配列要素の保存期間は、それらの完全なオブジェクトの保存期間 (1.8) です。

つまりx->a、以下の例では、動的ストレージ期間があります。

オブジェクトとaの間でメンバーに異なる動作を吹き込むストレージ期間を参照する、他の場所で定義されたセマンティクスがあるかどうか疑問に思っています 例として、オブジェクトの有効期間を管理するルールがあります。*xy

struct T
{
   int a;
};

int main()
{
   std::unique_ptr<T> x(new T);
   T y;
}

また、T非 POD (およびその他の種類の UDT) の場合はどうでしょうか?

要するに、私のトカゲの脳は、int a;自動 (または静的) な保存期間があるように見える宣言を期待しています。


アップデート:

次に例を示します。

[C++11: 3.7.4.3/4]:[..] あるいは、実装が厳密なポインター安全性を持つ場合があります。その場合、安全に派生したポインター値ではないポインター値は、参照される完全なオブジェクトが動的ストレージ期間でない限り、無効なポインター値です [..]

x->a表面的には、 myと myの間でセマンティクスが異なるとは思いy.aませんが、オブジェクトの有効期間に明らかに関連していない領域があることは明らかです。

また、多くの場所で「自動保存期間付き」と明示的に述べているラムダキャプチャルールについても懸念しています。

[C++11: 5.1.2/11]:ラムダ式に関連付けられた capture-defaultとその複合ステートメントodr-uses (3.2)thisまたは自動保存期間を持つ変数がある場合[..]

[C++11: 5.1.2/18]:自動保存期間のエンティティを指定する、括弧で囲まれた可能性のあるid-expressionであるdecltype((x))whereのすべての出現は、odr-use の場合に宣言されたクロージャー型の対応するデータ メンバーへのアクセスに変換されたかのように扱われます。示されたエンティティ。xxx

その他。

4

1 に答える 1

2

いいえ。この保存期間の継承により、サブオブジェクトが機能します。他のことをすることは、まったく不可能です。そうしないと、静的にも動的にも割り当てることができる型を設計できませんでした。

簡単に言えば、このルールに違反すると、すべてが壊れてしまいます。

于 2012-12-06T12:44:58.943 に答える