我如何能够获得指向通用引用的指针?

Gia*_*cci 2 c++ templates c++11

我有这个代码:

char X[64];

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

用这个打电话:

const char* tx = "hello!";
f(tx, strlen(tx));
Run Code Online (Sandbox Code Playgroud)

但是当我打印变量X不是我想要的!我认为我对e的通用引用(即E && e)被认为是不正确的.

任何的想法?

And*_*owl 7

你的通用引用[*]变成了对const char*类型推导后的左值引用(E推断为const char*&).

因此,而不是:

memcpy(X, &e, len);
//        ^^
//        This is a pointer to a pointer to const char!
//                ^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

你应该用这个:

memcpy(X, e, len);
Run Code Online (Sandbox Code Playgroud)

[*]术语"通用引用"由Scott Meyers引入,它不是 C++ 11标准的一部分.标准只定义了参考折叠规则,而通用引用的抽象只是为了更容易理解这些规则是如何工作的.


Jos*_*eld 6

E将被推断为const char*&在这种情况下,因此e也将是类型const char*&(在参考折叠后).e指针对象也是如此.然后你做&e,这是取指针的地址.你想要的只是e直接传递指示的指针memcpy,因为它指向你想要复制的数据:

memcpy(X, e, len);
Run Code Online (Sandbox Code Playgroud)

类型扣除e:

E&& ? const char*& && ? const char*&
Run Code Online (Sandbox Code Playgroud)