成员子对象继承存储持续时间是否有任何不直观的副作用?

时间:2012-12-06 12:32:22

标签: c++ c++11 language-lawyer

之前我不知道,但是it turns out

  

[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和我的y.a之间的语义不同,但很明显有些区域与对象生命周期没有明显关系,他们在哪里。

我还关注lambda捕获规则,它在许多地方明确说明“具有自动存储持续时间”,例如:

  

[C++11: 5.1.2/11]:如果 lambda-expression 具有关联的 capture-default 及其复合语句 odr-uses(3.2 )this具有自动存储持续时间的变量 [..]

     

[C++11: 5.1.2/18]: decltype((x))的每次出现x都是可能带括号的 id-expression ,其中是自动存储持续时间的实体被视为x被转换为对闭包类型的相应数据成员的访问,如果x是对所表示实体的使用,则该声明将被声明。

和其他人。

1 个答案:

答案 0 :(得分:2)

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

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