我有这个代码:
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
推导为 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 标准的一部分。该标准仅定义参考折叠规则,通用参考的抽象只是为了更容易理解这些规则的工作原理。
E
将被推断为const char*&
在这种情况下,因此e
也将是类型const char*&
(在引用折叠后)。e
指针对象也是如此。然后你做&e
,它正在获取指针的地址。您想要的只是将指针e
直接传递给memcpy
,因为它指向您要复制的数据:
memcpy(X, e, len);
的类型扣除e
:
E&& → const char*& && → const 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 参数似乎是多余的。