2016-07-13 14 views
73

(void) ++__resultの目的は次のコードにありますか? stdなぜstd :: transformなどで 'for'ループのインクリメントが(void)にキャストされますか?

実装::変換:

// std::transform 
template <class _InputIterator, class _OutputIterator, class _UnaryOperation> 
inline _LIBCPP_INLINE_VISIBILITY 
_OutputIterator 
transform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op) 
{ 
    for (; __first != __last; ++__first, (void) ++__result) 
     *__result = __op(*__first); 
    return __result; 
} 
+5

が、私は疑問に思う '' (++ __結果)をstatic_cast ... – Brian

+5

だから...多く...下線... – James

答えて

101

operator,をオーバーロードすることが可能です。いずれかのオペランドをvoidにキャストすると、オーバーロードされた演算子はvoidのパラメータを取ることができないため、オーバーロードされた演算子は呼び出されません。

+26

うわー。これは決して私には起こりませんでした。 – Angew

+11

@Angewこれらはたくさんあります。もっと楽しくなるためには、マイクロソフトのコンパイラエンジニア、STLの[この投稿](https://www.reddit.com/r/cpp/comments/1tedni/notsocommon_pitfalls_of_c_xpost_rcplusplus/ce7bqnu)を読んでください。 – thirtythreeforty

+6

同じように、単項の '&'ではなく、標準ライブラリの 'addressof'やそれに相当するものが多用されます。 –

5

ある場合は、オーバーロードされたコールoperator,を回避します。タイプvoidは、関数(演算子)の引数にすることはできません。

別のアプローチは、途中でvoid()を挿入するようになります:スタイルガイドを書き、人々は本当に著者が書かれていた場合、このコードは明確だと思う場合

++__first, void(), ++__result 
関連する問題