この提案を使用して静的アサートを実行しようとしましたが、テンプレートのメソッド内で使用してもコンパイル エラーは発生しません。
例は次のとおりです。
#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 );
}
VLA は c++ ISO でサポートされていないという警告とともに、g++ 4.7.2 でコンパイルしました。
g++ -Wall -g -std=c++98 -Wextra -pedantic gvh.cpp
では、テンプレート メソッド内で STATIC_ASSERT を使用すると、コンパイルが失敗しないのはなぜでしょうか? 失敗させる方法はありますか?
注:可能であれば、マクロのみで、c++98(おそらくc++03)ソリューションが必要です。