7

我以前不知道这一点,但事实证明

[C++11: 3.7.5]:成员子对象、基类子对象和数组元素的存储时间是它们完整对象的存储时间(1.8)。

这意味着x->a在下面的示例中具有动态存储持续时间。

我想知道是否有任何其他地方定义的语义引用存储持续时间,使成员在 object和?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]:[..] 或者,实现可能具有严格的指针安全性,在这种情况下,不是安全派生的指针值的指针值是无效的指针值,除非引用的完整对象具有动态存储持续时间[..]

从表面上看,我不希望 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是表示实体。

和别的。

4

1 回答 1

2

不。这种存储持续时间继承是使子对象工作的原因。做其他任何事情都是完全不可能的。否则,您无法设计任何可以静态和动态分配的类型。

简而言之,任何违反此规则的行为都会破坏一切。

于 2012-12-06T12:44:58.943 回答