2

我有这个代码:

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)不正确。

任何的想法?

4

3 回答 3

7

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 标准的一部分。该标准仅定义参考折叠规则,通用参考的抽象只是为了更容易理解这些规则的工作原理。

于 2013-03-01T15:31:35.307 回答
6

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

memcpy(X, e, len);

的类型扣除e

E&& → const char*& && → const char*&
于 2013-03-01T15:30:48.770 回答
0

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

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

于 2013-03-01T15:59:59.207 回答