MSVC 和 LLVM 都使用编译器内置函数。 Boost 也不提供任何可能的实现。
如果不能完美实现,有没有近似的实现可以回退?例如,利用或修改Boost提供的字面相似的is_assignable和is_no throw_move_assignable?
is_nothrow_assignable
类型特征应该检查两件事:
U
可分配给类型 T
;要实现第一个,验证表达式
std::declval<T&>() = std::declval<U>()
是否格式良好就足够了。
示例:
template <typename, typename, typename = void>
struct is_assignable
: std::false_type {};
template <typename T, typename U>
struct is_assignable<T, U, std::void_t<decltype(std::declval<T&>() = std::declval<U>())>>
: std::true_type {};
第二个需要验证上面的表达式是否为noexcept。因此,类型特征可以通过组合这两个操作来实现。
示例:
template <typename T, typename U>
struct is_nothrow_assignable
: std::bool_constant<is_assignable<T, U>::value && noexcept(std::declval<T&>() = std::declval<U>())> {};