如何将指针指向通用引用
How I can a take a pointer to a universal reference?
我有这个代码:
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参数似乎是多余的。
相关文章:
- C++取消引用指针.为什么会发生变化
- 深层复制具有自引用指针的类
- Visual c ++,使用字符串引用/指针调用 dll 函数
- std::unordered_map::提取引用/指针失效
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 如何在 c++ 中使用带有数学运算的引用/指针?
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- 取消引用指针并立即为其分配变量,导致分段错误
- 如何获取指向类(而不是对象)的引用/指针
- 将类型参数传递给自引用指针
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 在析构函数内取消引用指针时出现分段错误
- 来自引用指针的内存泄漏
- 引用指针后面的值
- 无法取消引用指针
- 引用指针调用成员函数
- 未定义的引用指针的变量模板在clang中功能,而不是GCC
- 取消引用指针以创建数组的副本
- 有关启动引用指针的引用的问题