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

Are there any unintuitive side-effects of member subobjects inheriting storage duration?

本文关键字:任何非 直观 副作用 是否 持续时间 对象 继承 存储 成员      更新时间:2023-10-16

我以前不知道,但事实证明:

[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->ay.a之间的语义有所不同,但很明显,有些领域与对象生存期没有明显的关系,它们确实存在

我还关心lambda捕获规则,它在许多地方明确表示"具有自动存储持续时间",例如:

[C++11: 5.1.2/11]:如果lambda表达式具有关联的捕获默认值及其复合语句odr使用(3.2)this具有自动存储持续时间的变量[..]

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

和其他。

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

简单地说,任何违反这条规则的行为都会破坏一切。