C++ 我怎样才能将指针指向通用引用?

C++ 我怎样才能将指针指向通用引用?,c++,templates,c++11,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); } 但是当我打印变量X时,我并不想要它! 我认为我对e(即声明为e&&e)的普遍引用是不正确的 有什么想法吗?E在这种情况下将被推断为const char*&,因此E也将是const char*&类型(在引用折叠之后)。所以e

我有以下代码:

char X[64];

template <typename E>
void f (E &&e, size_t len)
{
    memset(X, 0, 64);
    memcpy(X, &e, len);
}
但是当我打印变量X时,我并不想要它! 我认为我对e(即声明为e&&e)的普遍引用是不正确的


有什么想法吗?

E
在这种情况下将被推断为
const char*&
,因此
E
也将是
const char*&
类型(在引用折叠之后)。所以
e
是一个指针对象。然后执行
&e
,它获取指针的地址。您只需将
e
表示的指针直接传递到
memcpy
,因为它指向要复制的数据:

memcpy(X, e, len);
e
的类型推断:

E&& → const char*& && → const char*&

您的通用引用[*]在类型扣除后变成对
const char*
的左值引用(
E
被推断为
const char*&

因此,与此相反:

memcpy(X, &e, len);
//        ^^
//        This is a pointer to a pointer to const char!
//                ^^^^^^^^^^^^
您应该使用以下选项:

memcpy(X, e, len);


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

不太清楚您想要实现什么。如果要将常规变量复制到缓冲区,但要复制指针数据,可以提供专门化:

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);
}
模板
空f(E&E,尺寸长度)
{
memset(X,0,64);
memcpy(X、e、len);
}
模板
空隙f(E*E,尺寸长度)
{
memset(X,0,64);
memcpy(X,e,len);
}
这应该是可行的,但在这种情况下,“通用”引用的len参数似乎是多余的。

它不是类型系统的一部分,它只是一个(非标准)术语,可以(论证)用于理解参数推导和引用崩溃。引用必须是左值引用或右值引用。
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);
}