你能举一个例子,static_assert(...)
('C++11')可以很好地解决手头的问题吗?
我熟悉运行时assert(...)
。什么时候我应该选择static_assert(...)
而不是普通的assert(...)
?
另外,在boost
中有一个叫做BOOST_STATIC_ASSERT
的东西,它和static_assert(...)
是一样的吗
发布于 2009-10-30 11:47:43
静态断言用于在编译时进行断言。当静态断言失败时,程序根本不会编译。这在不同的情况下很有用,例如,如果您通过关键依赖于恰好32位的unsigned int
对象的代码来实现某些功能。您可以像这样放置一个静态断言
static_assert(sizeof(unsigned int) * CHAR_BIT == 32);
在你的代码中。在另一个平台上,对于不同大小的unsigned int
类型,编译将失败,从而将开发人员的注意力吸引到代码的有问题的部分,并建议他们重新实现或重新检查它。
再举另一个例子,您可能希望将一些整数值作为void *
指针传递给函数(这是一种技巧,但有时很有用),并且您希望确保整数值适合指针
int i;
static_assert(sizeof(void *) >= sizeof i);
foo((void *) i);
您可能希望将char
类型设置为signed
static_assert(CHAR_MIN < 0);
或者具有负值的整数除法舍入到零
static_assert(-5 / 2 == -2);
诸若此类。
在许多情况下,可以使用运行时断言来代替静态断言,但运行时断言仅在运行时且仅当控制通过断言时才有效。由于这个原因,失败的运行时断言可能处于休眠状态,在很长一段时间内未被检测到。
当然,静态断言中的表达式必须是编译时常量。它不能是运行时值。对于运行时值,您别无选择,只能使用普通的assert
。
发布于 2010-01-12 20:18:36
BOOST_STATIC_ASSERT
是static_assert
功能的跨平台包装器。
目前,我使用static_assert是为了在一个类上执行“概念”。
示例:
template <typename T, typename U>
struct Type
{
BOOST_STATIC_ASSERT(boost::is_base_of<T, Interface>::value);
BOOST_STATIC_ASSERT(std::numeric_limits<U>::is_integer);
/* ... more code ... */
};
如果不满足上述任何条件,这将导致编译时错误。
发布于 2009-10-30 11:43:31
static_assert
的一个用途可能是确保结构(即与外部世界的接口,如网络或文件)完全符合您的期望大小。这将捕捉到有人在没有意识到后果的情况下从结构中添加或修改成员的情况。static_assert
将拾取它并向用户发出警报。
https://stackoverflow.com/questions/1647895
复制相似问题