我以前不知道这一点,但事实证明:
[C++11: 3.7.5]:
成员子对象、基类子对象和数组元素的存储时间是它们完整对象的存储时间(1.8)。
这意味着x->a
在下面的示例中具有动态存储持续时间。
我想知道是否有任何其他地方定义的语义引用存储持续时间,使成员在 object和?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]:
[..] 或者,实现可能具有严格的指针安全性,在这种情况下,不是安全派生的指针值的指针值是无效的指针值,除非引用的完整对象具有动态存储持续时间[..]
从表面上看,我不希望 myx->a
和 my之间的语义有所不同y.a
,但很明显,存在与对象生命周期没有明显关系的区域。
我还担心 lambda 捕获规则,它在许多地方明确声明“具有自动存储持续时间”,例如:
[C++11: 5.1.2/11]:
如果lambda 表达式具有关联的捕获默认值及其复合语句odr-uses (3.2)this
或具有自动存储持续时间的变量[..]
[C++11: 5.1.2/18]:
每次出现decltype((x))
wherex
是一个可能带括号的 id 表达式,它命名一个自动存储持续时间的实体,都被视为x
转换为对闭包类型的相应数据成员的访问,如果x
是表示实体。
和别的。