繁体   English   中英

static_assert 内部/外部类定义

[英]static_assert inside/outside class definition

为什么 static_assert 需要在类定义之外?

失败代码

#include <type_traits>

class A
{
public:
    A(A&&) noexcept {}
    static_assert(std::is_nothrow_move_constructible<A>::value, "ERROR");
};

int main()
{
}

工作代码

#include <type_traits>

class A
{
public:
    A(A&&) noexcept {}

};

static_assert(std::is_nothrow_move_constructible<A>::value, "ERROR");

int main()
{
}

什么时候在类或结构的定义中使用 static_asserts 合适?

static_assert本身的位置而言,您的代码的两个版本都是有效的。 所以,不, static_assert不需要在类定义之外。 正式的static_assert是一个声明 在任何允许声明的地方都允许。

您遇到的问题与static_assert本身无关。

这里的问题是您用作static_assert ( std::is_nothrow_move_constructible ) 参数的表达式需要类类型完整才能正常工作。 但是在class A的定义里面,class type A还不完整,这使得你的参数表达式无效。 这就是为什么您的static_assert仅在类定义之外按预期工作的原因,其中A是完整的。 然而,这完全是关于std::is_nothrow_move_constructible正确使用,而不是关于static_assert本身。

请注意,即使成员函数是在类定义中定义的,内部成员函数体中的类类型也被视为完整类型。 使用此功能,您可以将代码重写为

class A
{
public:
    A(A&&) noexcept {
      static_assert(std::is_nothrow_move_constructible<A>::value, "ERROR"); 
    }
};

并且std::is_nothrow_move_constructible<A>将产生正确的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM