私はこれを以前は知りませんでしたが、次のことがわかりました。
[C++11: 3.7.5]:
メンバー サブオブジェクト、基底クラス サブオブジェクト、および配列要素の保存期間は、それらの完全なオブジェクトの保存期間 (1.8) です。
つまりx->a
、以下の例では、動的ストレージ期間があります。
オブジェクトとa
の間でメンバーに異なる動作を吹き込むストレージ期間を参照する、他の場所で定義されたセマンティクスがあるかどうか疑問に思っています 例として、オブジェクトの有効期間を管理するルールがあります。*x
y
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 の場合に宣言されたクロージャー型の対応するデータ メンバーへのアクセスに変換されたかのように扱われます。示されたエンティティ。x
x
x
その他。