C++20:使用概念实现std::is_constructible

C++20: Implement std::is_constructible using concepts

本文关键字:std is constructible 实现 C++20      更新时间:2024-09-30

是否有一种可移植的方法可以使用概念来实现std::is_constructible,而不使用STL,只使用requires表达式或模板元编程?

考虑这个代码:

template <class T, class... Args>
struct is_constructible
: std::bool_constant<requires {
new T(std::declval<Args>()...);
}> {
};

它适用于除引用之外的其他数据类型,因为不能new引用类型。

// Test cases
auto main() -> int {
static_assert(is_constructible<int>::value);
static_assert(is_constructible<int, int>::value);
static_assert(is_constructible<int, float>::value);
static_assert(!is_constructible<int, int *>::value);
static_assert(is_constructible<int &, int &>::value);
static_assert(is_constructible<int &&, int &&>::value);
static_assert(!is_constructible<void, void>::value);
static_assert(!is_constructible<int(), int()>::value);
static_assert(is_constructible<int (*)(), int()>::value);
static_assert(!is_constructible<intptr_t, int *>::value);
static_assert(!is_constructible<int &, float &>::value);
static_assert(std::is_constructible<int>::value);
static_assert(std::is_constructible<int, int>::value);
static_assert(std::is_constructible<int, float>::value);
static_assert(!std::is_constructible<int, int *>::value);
static_assert(std::is_constructible<int &, int &>::value);
static_assert(std::is_constructible<int &&, int &&>::value);
static_assert(!std::is_constructible<void, void>::value);
static_assert(!std::is_constructible<int(), int()>::value);
static_assert(std::is_constructible<int (*)(), int()>::value);
static_assert(!std::is_constructible<intptr_t, int *>::value);
static_assert(!std::is_constructible<int &, float &>::value);

return {};
}

否。当然不是";干净漂亮";。

事实上,在标准化过程中,早期的提案试图使用requires表达式来实现constructible_from,但有太多的角落案例,我们放弃了,而是根据类型特征来指定它。