成员子对象继承存储持续时间是否有任何非直观的副作用
Are there any unintuitive side-effects of member subobjects inheriting storage duration?
我以前不知道,但事实证明:
[C++11: 3.7.5]:
成员子对象、基类子对象和数组元素的存储持续时间是其完整对象的存储时间(1.8)
这意味着下面示例中的x->a
具有动态存储持续时间。
我想知道是否有其他定义的语义引用了存储持续时间,这些语义使成员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]:
[..]或者,一个实现可能具有严格的指针安全性,在这种情况下,不是安全派生的指针值的指针值是无效的指针值,除非引用的完整对象具有动态存储持续时间[..]
从表面上看,我不希望我的x->a
和y.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使用,则该数据成员将被声明。
和其他。
否。这种存储持续时间继承使子对象能够工作。做任何其他事情都是完全不可能的。否则,您就无法设计任何可以静态和动态分配的类型。
简单地说,任何违反这条规则的行为都会破坏一切。
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- std::stoi 的版本拒绝任何非数字
- 如何将任何化合物还原为非化合物类型
- 在非constexpr函数上添加的constexpr限定符不会触发任何警告
- uninit_member:非静态类成员m_wszParams未在此构造函数中初始化,也不在它C++中调用的任何函数中初
- C++任何非类型参数的模板专用化
- 非复制标准::shared_ptr<提升::任何>?
- 如何确定具有文件路径的字符串中是否有任何非 ASCII 字符
- 我可以创建一个可以接受任何枚举的模板(非类型)param类吗?C 11
- 如何设计可序列化类以使任何非序列化属性都会导致编译时错误
- 成员子对象继承存储持续时间是否有任何非直观的副作用
- 您是否知道使用非恢复构建方法来管理构建的任何构建工具
- 将 rvalue/temp 对象传递给需要非成本引用的函数的任何方法
- 重载运算符:常量与非常量返回类型:任何性能差异
- 使用std::函数从任何对象调用非静态方法
- 如何使用非托管 EasyHook 从进程内的任何线程挂钩方法
- 任何将非QObject类与QML一起使用的机会
- MFC 反编译为任何非汇编代码
- c++矢量性能非直观结果
- 视觉 任何非(字符*)正确的方法,用于从 C++ 中的常量字符串初始化 void*