gcc (g++) や Clang++ には -Wold-style-cast という警告オプションがあって、 C++ スタイルではなく C スタイルのキャストをすると警告されます。

intptr_t foo(void* x)
{
    return (intptr_t)x; // 警告
    // return reinterpret_cast<intptr_t>(x); // OK
}

さて、C には未使用変数がある時に警告されないようにする idiom として void にキャストする、というものがあります。

int bar(int x)
{
    (void)x;
    return 0;
}

これは C スタイルキャストですが、C++ で -Wold-style-cast 下であっても警告されません。

そもそもなんで C スタイルキャストを警告しようという話になるかというと、 C スタイルキャストは実際の挙動は static_cast だったり reinterpret_cast だったりして曖昧で危険であるからです。void にキャストしている場合は式の値は存在しないため曖昧でも危険でもないから、見た目 C スタイルキャストであっても警告しないように「気を利かせている」のでしょう。

Trackback

no comment untill now

Add your comment now