N3000によれば、static_assertは、以下のように定義されている。
static_assert ( constant-expression , string-literal ) ;
string-literalは、以下のように定義されている。
2.14.5 String literals [lex.string]
string-literal:
encoding-prefix opt " s-char-sequenceopt "
encoding-prefix opt R raw-string
encoding-prefix:
u8
u
U
L
とすれば、以下のコードはコンパイルが通るはずである。
int main()
{
static_assert( true, "..." ) ;
static_assert( true, R"***[...]***" ) ;
static_assert( true, u8"..." ) ;
static_assert( true, u8R"***[...]***" ) ;
static_assert( true, u"..." ) ;
static_assert( true, uR"***[...]***" ) ;
static_assert( true, U"..." ) ;
static_assert( true, UR"***[...]***" ) ;
static_assert( true, L"..." ) ; // これだけは最低でもコンパイル出来るべき
static_assert( true, LR"***[...]***" ) ;
}
しかるに、VC10 Beta 2では、最初のstatic_assert以外、すべてエラーになってしまう。もちろん、VC10は、raw string literalをサポートしていないし、encoding-prefixも、Lしかサポートしていない。しかし、最低でも、L"..."はコンパイルできてしかるべきだ。それが、何故かできない。
これは明らかに規格違反であるが、実は、ここでエンコーディングプレフィクスが使えても、特に役には立たないのである。というのも、規格では、basic source character set外の文字は、メッセージとして表示することを求められていないからだ。
int main()
{
// OK. でも日本語が表示されるとは限らない
static_assert( false, U"でっきるかな? できるかな? さてさてホホゥ!" ) ;
}
規格では、このコードは、コンパイルエラーにならなければならない。その際に、diagnostic messageを表示することが、規格では求められているが、basic source character set外の文字は、表示しなくてもよい。というわけで、このコードは、規格準拠のコンパイラであれば、「動く」が、メッセージとして日本語が表示される保証はないのである。
No comments:
Post a Comment