如何静态地断言 static_cast 是 noexcept 的?

3

我有一个函数对象,可以将任何类型静态转换为特定类型,定义如下:

template <typename T_Out>
struct cast_to {
    template <typename T_In>
    T_Out operator()(T_In&& value) const noexcept {
        return static_cast<T_Out>(value);
    }
};

现在,我想将函数对象的使用限制为那些被声明为 noexcept 的静态转换表达式。这个想法是在 operator() 函数中添加一些静态断言。到目前为止,我已经尝试了两个 constexpr 表达式:

std::is_nothrow_constructible<T_Out, decltype(value)>::value

并且

noexcept(static_cast<T_Out>(value))

这两种方法都可以按照我的期望工作(实际上,我已经发现第一个检查也包括了另一个,在GCC上至少是这样)。我应该选择哪种方法?是否还有更好的替代方案?

1个回答

1
这取决于你想要达到多高的技术正确性。正如你所说,两个选项都能实现预期目标-防止编译。区别在于:
  • std::is_nothrow_constructible 测试始终会评估为 true 或 false,使你的断言通过或失败。

  • noexcept 测试将评估为 true、false 或者如果你传递根本不转换的参数,则无法编译内部 static_cast 检查。

我会选择以下之一:

  1. SFINAE 检查 std::is_nothrow_constructible
  2. SFINAE 检查 std::is_constructible,并使用 static_assert 进行 noexcept 检查

选项 2 可能具有更好的诊断效果,但选项 1 可能更加技术上正确。这是个人偏好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接