我有这段代码:
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&amp;&amp; e )的通用引用不正确。
有什么想法吗?
答案 0 :(得分:7)
您的通用引用[*]在类型扣除后变为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标准的一部分。标准只定义了参考折叠规则,而通用引用的抽象只是为了更容易理解这些规则是如何工作的。
答案 1 :(得分:6)
E
将被推断为const char*&
,因此e
也将是const char*&
类型(参考折叠后)。所以e
是一个指针对象。然后你做&e
,它取指针的地址。您想要的是将e
表示的指针直接传递给memcpy
,因为它指向您要复制的数据:
memcpy(X, e, len);
e
的类型扣除:
E&& → const char*& && → const char*&
答案 2 :(得分: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参数似乎是多余的。