[libcxx-commits] [libcxx] [libc++] Implement P3836R2: Make `optional<T&>` trivially copyable (PR #171528)

A. Jiang via libcxx-commits libcxx-commits at lists.llvm.org
Mon Dec 22 19:03:48 PST 2025


================
@@ -95,5 +100,12 @@ int main(int, char**) {
         NonTrivialTypes::ApplyTypes<DoTestsMetafunction>{},
         DoTestsMetafunction<TrivialMoveNonTrivialCopy, TrivialCopyNonTrivialMove>{}
     );
+
+#if TEST_STD_VER >= 26
+    static_assert(std::is_trivially_copyable_v<std::optional<TrivialMoveNonTrivialCopy&>>);
----------------
frederick-vs-ja wrote:

In addition to `std::is_trivially_copyable_v<std::optional<T&>>`, I think it's better to `static_assert` that the following values are all `true`.
- `std::is_trivially_copy_constructible_v<std::optional<T&>>`
- `std::is_trivially_move_constructible_v<std::optional<T&>>`
- `std::is_trivially_constructible_v<std::optional<T&>, std::optional<T&>&>`
- `std::is_trivially_constructible_v<std::optional<T&>, const std::optional<T&>&&>`
- `std::is_trivially_copy_assignable_v<std::optional<T&>>`
- `std::is_trivially_move_assignable_v<std::optional<T&>>`
- `std::is_trivially_assignable_v<std::optional<T&>&, std::optional<T&>&>`
- `std::is_trivially_assignable_v<std::optional<T&>&, const std::optional<T&>&&>`
- `std::is_trivially_destructible_v<std::optional<T&>>`

These `static_assert`'s should ensure that the trivial copyability isn't achieved in some unexpected way, e.g. using deleted or non-public functions, or implementing related operations with function templates.

https://github.com/llvm/llvm-project/pull/171528


More information about the libcxx-commits mailing list