如何将指针指向通用引用

How I can a take a pointer to a universal reference?

本文关键字:引用 指针      更新时间:2023-10-16

我有这个代码:

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

知道吗?

经过类型推导,您的通用引用[*]变成了对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标准的而非部分。该标准只定义了引用折叠规则,而通用引用的抽象只是为了更容易地理解这些规则是如何工作的。

在这种情况下,

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

memcpy(X, e, len);

e:的类型推导

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

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

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参数似乎是多余的。