我如何能够获得指向通用引用的指针?

时间:2013-03-01 15:29:01

标签: 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);
}

用这个打电话:

const char* tx = "hello!";
f(tx, strlen(tx));

但是当我打印变量X不是我想要的! 我认为我对 e (声明为 E&amp;&amp; e )的通用引用不正确。

有什么想法吗?

3 个答案:

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