【发布时间】:2013-01-31 09:06:40
【问题描述】:
我尝试使用this suggestion 进行静态断言,但如果在模板的方法中使用它,我不会收到编译错误。
示例如下:
#include <iostream>
#define STATIC_ASSERT(expr, msg) \
{ \
char STATIC_ASSERTION__##msg[(expr)?1:-1]; \
(void)STATIC_ASSERTION__##msg[0]; \
}
template <typename T >
class A
{
public:
int foo(const int k )
{
// does not work
STATIC_ASSERT( k > 9, error_msg );
return k+5;
}
};
int bar(const int k )
{
// works fine
//STATIC_ASSERT( k > 9, error_msg );
return k+5;
}
int main()
{
A<int> a;
const int v = 2;
std::cout<<a.foo(v)<<std::endl;
std::cout<<bar(v)<<std::endl;
// works fine
//STATIC_ASSERT( v > 9, error_msg );
}
我用 g++ 4.7.2 编译它,并警告说 C++ ISO 不支持 VLA:
g++ -Wall -g -std=c++98 -Wextra -pedantic gvh.cpp
那么,为什么在模板方法中使用 STATIC_ASSERT 时编译不会失败?有没有办法让它失败?
注意:我需要一个 c++98(甚至可能是 c++03)的解决方案,如果可能的话,只能使用宏。
【问题讨论】:
-
Boost 有一个 pre-C++11 静态断言。
-
@chris 是的,我知道 BOOST_STATIC_ASSERT,但它使用 SFINAE 进行检查。
-
在答案和上面有很好的建议,关于哪些静态断言机制存在,但更根本的是,在你的具体用法中,你试图对函数参数进行断言 - 只是因为它是
const int没有'这意味着它是编译时常量——这只是意味着该函数获取运行时参数的副本,并且不允许被调用的代码修改它。您需要接受k作为模板参数(对于A或通过将A::foo设置为template <int K>,或者可能使用C++11constexpr,以获得编译时间检查你'期待。
标签: c++ macros g++ static-assert c++98