void*铸造到char*不是lvalue
void* cast to char* not lvalue?
我正在尝试制作一个符合void*
的函数,将内存复制到它,然后移动指针。由于它是一个无效的指针,所以我想我会把它扔给 char*
并像这样移动:
PVOID SendAndMoveHead(PVOID dest, const Message& message, const size_t& size)
{
PVOID ret = CopyMemory(dest, (PVOID)message.msg.c_str(), size);
((char*)dest) += size;
return ret;
}
但是,vs抱怨 ((char*)dest)
说
表达式必须一个可修改的lvalue
我认为是,因为以下工作:
PVOID SendAndMoveHead(PVOID dest, const Message& message, const size_t& size)
{
PVOID ret = CopyMemory(dest, (PVOID)message.msg.c_str(), size);
char* d = (char*)dest;
d += size;
return (PVOID)d;
}
如果有人可以阐明为什么第一个版本不应该工作,我会真正感激它。
((char*)dest)
为您提供新的临时char *
。((char*)dest) += size;
会改变临时性并且没有效果,这会导致汇编失败。
在第二个示例中, d
不是临时的,而且寿命足够长以返回。
另外,您可以编写return (char*)dest + size;
。
相关文章:
- 检查输入是否不是整数或数字
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 为什么使用SFINAE而不是函数重载
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 为什么std::valarray不是算术的
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- MSVC是否支持C++11样式的属性而不是__declspec
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 为什么make_tie不是一件事
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 为什么std::isnan 不是 constexpr?
- GlobalAlloc而不是其他分配方法
- 当比特(而不是字节)的顺序至关重要时的持久性
- 为什么复制而不是移动数据元素?
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- C++ 方法调用 (lvalue) 绑定到派生类中的函数 (rvalue),而不是基类中的函数 (lvalue)
- void*铸造到char*不是lvalue
- 为什么通过运算符的地址获得的指针不是lvalue