1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 23:17:46 +00:00

AK: Make smart pointer factories work with aggregates

Aggregate initialization with brace-enclosed parameters is a
[C++20 feature][1] not yet implemented by Clang. This caused compile
errors if we tried to use the factory functions to create smart pointers
to aggregates.

As a (temporary) fix, [the LWG's previously proposed solution][2] is
implemented by this commit.

Now, wherever it's not possible to direct-initialize, aggregate
initialization is performed.

[1]:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0960r3.html
[2]: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#2089
This commit is contained in:
Daniel Bertalan 2021-07-01 10:21:14 +02:00 committed by Ali Mohammad Pur
parent fda9f394d1
commit 3c6bdb8a61
5 changed files with 37 additions and 4 deletions

View file

@ -336,11 +336,17 @@ inline void swap(NonnullRefPtr<T>& a, NonnullRefPtr<U>& b)
}
template<typename T, class... Args>
inline NonnullRefPtr<T> create(Args&&... args)
requires(IsConstructible<T, Args...>) inline NonnullRefPtr<T> create(Args&&... args)
{
return NonnullRefPtr<T>(NonnullRefPtr<T>::Adopt, *new T(forward<Args>(args)...));
}
// FIXME: Remove once P0960R3 is available in Clang.
template<typename T, class... Args>
inline NonnullRefPtr<T> create(Args&&... args)
{
return NonnullRefPtr<T>(NonnullRefPtr<T>::Adopt, *new T { forward<Args>(args)... });
}
}
template<typename T>