gpt4 book ai didi

c++ - static_assert 和类模板

转载 作者:太空狗 更新时间:2023-10-29 20:21:32 27 4
gpt4 key购买 nike

我对 static_assert 功能有疑问。当我直接实例化一个类模板时,一切都按预期进行。但是当我将它作为参数传递给不同的类模板时,static_assert 不起作用。

template <int X>
class A{
static_assert(X == 0, "X != 0");
};

template <class T>
class B{

};

B<A<1>> b; // Static assert does not work
A<1> a; // error: static assertion failed: X != 0

编辑

谢谢大家的回答。有没有办法在不创建 A 实例/从 A 继承的情况下显式实例化 A?我正在尝试这个:

template <int X>
class A{
static_assert(X == 0, "X != 0");
};

template <class T>
class B;

template <template <int X> class T, int X>
class B<T<X>>{
template class T<X>;
};

但这是不正确的。

最佳答案

对于 B<A<1>> b; , A<1>仅用作模板参数,不会导致 implicit instantiation类模板 A , 然后是 static_assert里面A的定义不会被触发。

When code refers to a template in context that requires a completely defined type, or when the completeness of the type affects the code, and this particular type has not been explicitly instantiated, implicit instantiation occurs. For example, when an object of this type is constructed, but not when a pointer to this type is constructed.

另一方面,对于 A<1> a; , A<1>需要是一个完整的类型(构造 a ),然后隐式实例化发生, static_assert被解雇了。

编辑

您可以使用 sizeof (要求类型完整)导致隐式实例化并触发 static_assert .例如

template <class T>
class B{
static_assert(sizeof(T) > 0, "static_assert for implicit instantiation");
};

关于c++ - static_assert 和类模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43762072/

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