[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