Gia*_*cci 2 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);
}
Run Code Online (Sandbox Code Playgroud)
用这个打电话:
const char* tx = "hello!";
f(tx, strlen(tx));
Run Code Online (Sandbox Code Playgroud)
但是当我打印变量X不是我想要的!我认为我对e的通用引用(即E && e)被认为是不正确的.
任何的想法?
你的通用引用[*]变成了对const char*类型推导后的左值引用(E推断为const char*&).
因此,而不是:
memcpy(X, &e, len);
// ^^
// This is a pointer to a pointer to const char!
// ^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
你应该用这个:
memcpy(X, e, len);
Run Code Online (Sandbox Code Playgroud)
[*]术语"通用引用"由Scott Meyers引入,它不是 C++ 11标准的一部分.标准只定义了参考折叠规则,而通用引用的抽象只是为了更容易理解这些规则是如何工作的.
E将被推断为const char*&在这种情况下,因此e也将是类型const char*&(在参考折叠后).e指针对象也是如此.然后你做&e,这是取指针的地址.你想要的只是e直接传递指示的指针memcpy,因为它指向你想要复制的数据:
memcpy(X, e, len);
Run Code Online (Sandbox Code Playgroud)
类型扣除e:
E&& ? const char*& && ? const char*&
Run Code Online (Sandbox Code Playgroud)