此代码演示了使用模板的编译时断言。我发现它只能由 g++ (4.4.7) 使用以下 cmd 行编译。
$ g++ -std=c++98 a.cpp -o a
Nether icc (13.0.1) 和 visual c++ (14.00.50727.762 for 80x86) 都可以编译它。对于icc,它会生成这样的错误消息
$ icpc a.cpp -o a
a.cpp(13): error: non-integral operation not allowed in nontype template argument
COMPILE_TIME_ASSERT(true && "err msg");
^
a.cpp(13): error: class "CompileTimeAssert<<error-constant>>" has no member "Check"
COMPILE_TIME_ASSERT(true && "err msg");
^
compilation aborted for a.cpp (code 2)
但是我发现像在断言中添加自定义消息true && "err msg"
一样在运行时断言中广泛使用的断言?
问题是
- 是否可以在不修改代码的情况下仅使用适当的编译选项来解决此问题?
- 如果不能,任何编译时断言的替代方法与自定义消息?
演示代码如下所示。
#include <iostream>
template<bool B> class CompileTimeAssert { };
template<> class CompileTimeAssert<true> {
public:
static inline void Check() { }
};
#define COMPILE_TIME_ASSERT(b) CompileTimeAssert<(b)>::Check()
int main()
{
COMPILE_TIME_ASSERT(true && "err msg");
std::cout<<(true && "err msg")<<std::endl;
return 0;
}