2

私はこのコードを持っています:

char X[64];

template <typename E>
void f (E &&e, size_t len)
{
    memset(X, 0, 64);
    memcpy(X, &e, len);
}

これで呼び出す:

const char* tx = "hello!";
f(tx, strlen(tx));

しかし、変数Xを印刷すると、私が望むものではありません! eへの普遍的な参照 ( E&& eとして宣言されている) が正しく行われていないと思います。

何か案が?

4

3 に答える 3

7

ユニバーサル参照 [*] はconst char*、型推定 (Eは be と推定されますconst char*&) 後の左辺値参照に変わります。

したがって、これの代わりに:

memcpy(X, &e, len);
//        ^^
//        This is a pointer to a pointer to const char!
//                ^^^^^^^^^^^^

これを使用する必要があります:

memcpy(X, e, len);

[*] 「ユニバーサル リファレンス」という用語は Scott Meyers によって導入されたものであり、C++11 標準の一部ではありません。標準は、参照の折りたたみルールのみを定義しており、ユニバーサル参照の抽象化は、それらのルールがどのように機能するかをより簡単に理解できるようにすることのみを目的としています。

于 2013-03-01T15:31:35.307 に答える
6

Econst char*&この場合は であると推定されるためe、タイプconst char*&も (参照の崩壊後) になります。ポインターeオブジェクトも同様です。次に&e、ポインターのアドレスを取得します。コピーしたいデータを指しているので、 で示されるポインタを にe直接渡すだけです。memcpy

memcpy(X, e, len);

の型推論e:

E&& → const char*& && → const char*&
于 2013-03-01T15:30:48.770 に答える
0

何を達成しようとしているのかは明確ではありません。通常の変数をバッファにコピーしたいが、ポインタのデータをコピーしたい場合は、特殊化を提供できます。

char X[64];

template <typename E>
void f (E &&e, size_t len)
{
    memset(X, 0, 64);
    memcpy(X, &e, len);
}

template <typename E>
void f (E *e, size_t len)
{
    memset(X, 0, 64);
    memcpy(X, e, len);
}

これは機能するはずですが、この場合、「ユニバーサル」参照の len パラメータは冗長なようです。

于 2013-03-01T15:59:59.207 に答える