gpt4 book ai didi

c++ - 如何检测构造函数是否为 noexcept 并抛出析构函数

转载 作者:行者123 更新时间:2023-12-02 06:22:02 25 4
gpt4 key购买 nike

以下代码在大多数编译器上都无法编译:

#include <type_traits>

class Foo
{
public:
Foo() noexcept {}
~Foo() noexcept(false) {}
};

static_assert(std::is_nothrow_default_constructible_v<Foo>);

Cpp引用也states这在编译器实现中很常见,但没有提供替代方案。如何测试构造函数是否为 noexcept 而析构函数不会影响结果?

最佳答案

LWG issue 2116 中所述,从您链接的 cppreference 页面链接,这不是错误,而是预期的行为。

正如该问题中也提到的,可以使用非抛出的placement-new(它只构造但不破坏对象)来仅测试构造函数的异常规范:

static_assert(noexcept(::new(std::nothrow) Foo()));

这需要包括 <new>对于 std::nothrow .

这是该特征的粗略实现:

template<class T, class = void>
struct is_nothrow_default_constructible
: std::bool_constant<false> { };

template<class T>
struct is_nothrow_default_constructible<T,
std::enable_if_t<noexcept(::new(std::nothrow) T())>>
: std::bool_constant<true> { };

关于c++ - 如何检测构造函数是否为 noexcept 并抛出析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58894011/

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