gpt4 book ai didi

c++ - 为什么在 gcc 的 is_nothrow_constructible 实现中需要 static_cast?

转载 作者:行者123 更新时间:2023-12-01 11:57:48 26 4
gpt4 key购买 nike

取自 type_traits 的 GCC 实现为什么是 static_cast这里需要吗?

template <typename _Tp, typename... _Args>
struct __is_nt_constructible_impl
: public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))> {};

template <typename _Tp, typename _Arg>
struct __is_nt_constructible_impl<_Tp, _Arg>
: public integral_constant<bool,
// Why is `static_cast` needed here?
noexcept(static_cast<_Tp>(declval<_Arg>()))> {};

最佳答案

如果发明的变量声明,则类型不能从参数列表构造

T t(declval<Args>()...);

将是 well-formed并且是 known not to throw exceptions .在复数参数情况下,这等价于(模 noexcept 可破坏性,参见 LWG 2116)到 type conversion expression 的格式良好和不抛出
T(declval<Args>()...)

然而,在单参数情况下,表达式 T(declval<Args>())被视为 cast-expression ,它可以调用 const_cast and reinterpret_cast ;显式使用 static_cast恢复与申报表的等效性。

作为 concrete example ,考虑以下类型:
struct D;
struct B { operator D&&() const; };
struct D : B {};

这里有一个 static_cast来自 B constD&&必须使用转换运算符,但强制转换表达式可以绕过转换运算符,因此 noexcept 也是如此。所以省略了 static_cast is_nothrow_constructible<D&&, B const> 会给出错误的结果.

关于c++ - 为什么在 gcc 的 is_nothrow_constructible 实现中需要 static_cast?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59627535/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com