Par*_*esy 15 c++ static-assert type-traits c++11
为什么static_assert需要在类定义的一边?
失败的代码
#include <type_traits>
class A
{
public:
A(A&&) noexcept {}
static_assert(std::is_nothrow_move_constructible<A>::value, "ERROR");
};
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
工作代码
#include <type_traits>
class A
{
public:
A(A&&) noexcept {}
};
static_assert(std::is_nothrow_move_constructible<A>::value, "ERROR");
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
什么时候在类或结构的定义中使用static_assert是否合适?
AnT*_*AnT 22
就其static_assert自身的位置而言,两个版本的代码都是有效的.所以,不,static_assert不需要在类定义之外.正式static_assert是一份声明.只要允许声明,就允许它.
你遇到的问题与static_assert自己无关.
这里的问题是您用作static_assert(std::is_nothrow_move_constructible)的参数的表达式要求类类型完整才能正常工作.但是在类A类类型的定义中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");
}
};
Run Code Online (Sandbox Code Playgroud)
并std::is_nothrow_move_constructible<A>会产生正确的结果.
| 归档时间: |
|
| 查看次数: |
4405 次 |
| 最近记录: |