我以前不知道这一点,但是事实证明 https://stackoverflow.com/questions/13743357/location-of-members-of-an-object/13743395#comment18884848_13743395 that:
[C++11: 3.7.5]:
成员子对象、基类子对象和数组元素的存储期限是其完整对象的存储期限(1.8)。
这意味着x->a
在下面的示例中具有动态存储持续时间。
我想知道是否有任何其他地方定义的语义引用了 imbue 成员的存储持续时间a
对象之间有不同的行为*x
and y
?一个例子是管理对象生命周期的规则。
struct T
{
int a;
};
int main()
{
std::unique_ptr<T> x(new T);
T y;
}
如果T
是非 POD(以及其他类型的 UDT)吗?
简而言之,我的蜥蜴大脑期望任何类似的声明int a;
具有自动(或静态)存储持续时间,我想知道是否有任何标准措辞也意外地期望这一点。
Update:
这是一个例子:
[C++11: 3.7.4.3/4]:
[..] 或者,实现可能具有严格的指针安全性,在这种情况下,不是安全派生的指针值的指针值是无效的指针值除非引用的完整对象具有动态存储持续时间 [..]
从表面上看,我不希望我的语义有所不同x->a
and my y.a
,但很明显,有些区域与对象生命周期没有明显相关,但它们却与对象生命周期相关。
我还担心 lambda 捕获规则,它在许多地方明确声明“具有自动存储持续时间”,例如:
[C++11: 5.1.2/11]:
If a lambda 表达式有一个关联的捕获默认值和它的复合语句ODR 使用 (3.2)this
or 具有自动存储期限的变量 [..]
[C++11: 5.1.2/18]:
每次出现decltype((x))
where x
是一个可能带括号的id-表达式那个名字自动存储期限的实体被视为好像x
被转换为对闭包类型的相应数据成员的访问,如果x
是指定实体的网上解决使用。
和别的。
不会。这种存储持续时间继承是子对象发挥作用的原因。做任何其他事情都是根本不可能的。否则,您无法设计任何可以静态和动态分配的类型。
简而言之,任何违反这条规则的行为都会破坏一切。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)