C++ 命名要求: ImplicitLifetimeType
注意:标准没有定义具有此名称的命名要求。这是由核心语言定义的一种类型类别。为了保持一致性,此处将其作为命名要求包含。
要求
以下类型统称为 隐式生命周期类型
备注
如果能阻止未定义行为,某些操作可能会隐式地创建隐式生命周期类型的对象并开始它们的生命周期。但是,此类操作不会开始此类对象的非隐式生命周期类型的子对象的生命周期。
以下操作可能隐式创建对象
-
开始
unsigned char
或 std::byte (C++17 起) 数组生命周期的操作。 -
调用 std::aligned_alloc (C++17 起)、std::calloc、std::malloc 或 std::realloc。
-
任何隐式或显式调用名为 operator new 或 operator new[] 的函数(包括非分配和用户定义的放置分配函数)。包括:
- 调用 std::memory_resource::allocate,无论存储如何获取。包括: (自 C++17 起)
-
调用 std::memcpy 或 std::memmove。
- 调用 std::bit_cast (C++20 起)
- 调用 std::start_lifetime_as 或 std::start_lifetime_as_array。 (自 C++23 起)
-
如果联合的赋值运算符是内置的或平凡的,则涉及联合成员的赋值表达式。
缺陷报告
以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 发布时的行为 | 正确行为 |
---|---|---|---|
CWG 2489 | C++20 | 开始 char 数组生命周期的操作隐式创建对象 | 它不创建 |