転送エラーの場合

1747 ワード

1.forwardは初期化リストをサポートしない、あるいはforwardは複数のパラメータの集合を導くことができない.
2.一部のコンパイラはstatic const valに対する態度が直接置き換えられ、例えばstatic const val=7である.では、関数Func(val)についてはFunc(7)に等しい.しかし、未定義のstatic const valがテンプレートに入力forwardされると、予知できないエラーが発生する可能性がある.forwardの関数ポインタを試してみると、その関数がリロードされると、テンプレートがどのポインタを入力か分からないため、エラーが発生します.もちろん、わがままを言って、リロードされた関数ポインタを渡さなければならない場合は、別名.4を入力したほうがいいです.最後にforwardが失敗するのは、ビットドメインが関数のパラメータとして使用される場合です.
struct IPv4Header{

    std::uint_t version : 4

                , IHL : 4

                , DSCP : 6

                , ECN : 2

                , totalLength : 16;

    ...



};

ここに一つ
IPv4Header h;

h.totalLengthを直接転送するならいいです.しかし、T&&を関数パラメータとするテンプレート関数に先にパラメータとして渡す場合は別であり、h.totalLengthは非常量ビットドメイン(non-const bitfiled)であり、関数パラメータは参照である.下位層では、機械的に参照とポインタを見るのは実際には区別がないため、参照やポインタを用いて任意のバイナリコードをバインドすることはできない.したがって、ビットドメインをバインドするポインタは存在しない.はい、では、私がわがままで、ビットドメインを転送しなければならない場合は、どうすればいいですか?答えは簡単です.移行すれば、問題は解決します.
// 

auto length = static_cast<std::uint16_t>(h.totalLength);

まとめ:forwardはすごいですが、万能ではありません.テンプレートタイプの推定に失敗したり、導出タイプが正しくない場合もエラーが発生します.幸いなことに、間違いは極めて少なく、制御可能であり、以上のいくつかの状況をしっかり覚えて注意すれば、forwardの穴に飛び込むことはない.みそにする