2015-09-28 5 views
12

なぜこのベクトルをvoid(ポインタでなくても)にキャストできますか?void(ポインタではない)へのキャストは許可されています、なぜですか?

int main() 
{ 
    std::vector<int> a; 
    (void)a; 
} 

どうしてこれが可能ですか?

+3

これは破棄された値式です。値を破棄します。ちなみに、Cスタイルのキャストは使用しないでください。 –

+2

未使用の変数に関する警告を取り除くのは一般的な方法です(しかしそれは良い方法ではありません)。 – Jarod42

+0

私はなぜそれが許されているのかわかりませんが、時には変数を使用しない*コンパイラの警告を防ぐために使用します。 – Galik

答えて

15

voidへのキャストは、単に式の結果を破棄します。場合によっては、これを使用して "未使用変数"または "無視された戻り値"の警告を避ける人々が表示されます。実行されている変換の種類、それが明確になっていながら、C++で

、あなたはおそらく、 static_cast<void>(expr);はなく (void)expr;

これは値を廃棄するのと同じ効果がありを記述する必要があります。

標準は言う:

それが破棄され、値式(条項5)となる 場合た任意の式が明示的に、CVの空隙型に変換することができます。 [注: ただし、値が一時オブジェクト(12.2)にある場合、そのオブジェクトのデストラクタ は通常の時間まで実行されず、 の値はデストラクタを実行する目的で保持されます。 -end note]

ISO/IEC 14882:2011 5.2.9 par。 6

+0

'(void)expr;についてはあいまいですか? _C-casts_を使用していないか、またはC-cast版を避ける実際の理由があるからですか? – nwp

+1

@nwp - 通常の[Cスタイルのキャストを避ける理由](http://stackoverflow.com/a/32224/3852968)。無効にするためのキャストは特別なことはありません。 – Andrew

+5

しかし、ここには通常の理由のどれも適用されません。変換が行われないので、変換の種類は意味をなさない。キャストを検索する理由はありません。なぜなら、コンパイラの警告をシャットアップする以外に何もしないからです。弱いコードのマスキングはありません。これは、目的のためではなく、ルールのためのルールにちょうど従っています。 – nwp

関連する問題