是否可以在没有编译器内置函数的情况下实现 is_nothrow_assignable ?

问题描述 投票:0回答:1

MSVC 和 LLVM 都使用编译器内置函数。 Boost 也不提供任何可能的实现。

如果不能完美实现,有没有近似的实现可以回退?例如,利用或修改Boost提供的字面相似的is_assignable和is_no throw_move_assignable?

boost implementation type-traits
1个回答
0
投票

is_nothrow_assignable
类型特征应该检查两件事:

  1. 类型
    U
    可分配给类型
    T
  2. 以上操作是非抛出的。

要实现第一个,验证表达式

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>())> {};
© www.soinside.com 2019 - 2024. All rights reserved.