我需要将std::move移植到我的内核中吗?

14

我担心在内核空间中我将无法访问像std::movestd::forwardstd :: initializer_list 等的内容。虽然其中一些功能已内置于语言中,但仍需要相应的头文件和库实现。以下内容是否足以利用移动语义,或者我需要进行C++库的完整移植?

template <typename T>
typename remove_reference<T>::type&& move(T&& arg)
{
  return static_cast<typename remove_reference<T>::type&&>(arg);
}

6
独立实现仍应具有 <initializer_list>(但您无法自己编写它,因为它与编译器实现密切相关)。 std::movestd::forward 可能需要您自己编写,但它们只是美化的转换。移动语义需要(1)编译器支持和(2)支持移动的类型。如果您使用的是 C++03 的 std::vector 实现,即使使用 std::move 和 C++11 编译器,也无法获得移动语义。 - T.C.
+1 for os-dev,因为我也喜欢>o< - ikh
7
您所指的内核是什么?如果您指的是Linux内核,正确的答案是内核是用C而不是C++编写的。当然,您可以自行进行学习,但早先将C++代码纳入Linux内核的提议曾引起大笑,我认为这种情况永远不会改变。 - Sam Varshavchik
如果内核是Linux,那么使用C ++是不明智的。在某些操作系统内核中使用了C ++,例如OS X中的Apple IO Kit,其中继承用于使编写设备驱动程序变得更加容易。但是,Linus Torvalds和Linux内核社区中的其他人公开反对C++。 - Erik Alapää
你真的需要更详细地描述问题:你的开发环境是什么,你是从零开始编写操作系统,还是在编写Linux内核模块、其他操作系统驱动程序,或者是为嵌入式系统编写代码? - nhed
显示剩余2条评论
1个回答

1

假设没有打字错误,这就可以了。完整的定义在标准中给出(实际上有两个版本:旧版和新版),我已经完全按照此操作:只需将官方版本复制到我的头文件中,然后处理我的特殊要求和/或支持旧的gnu std lib,但编译器理解右值引用。

为了解决@T.C.的问题,即使提供的容器不知道如何使用它,编写自己的仅移动类型并能够使用它们仍然很有用,例如从函数返回。Boost容器类可以,如果您提供所有需要的std::move、std::forward等内容,您可以覆盖配置以告诉Boost您拥有&&。我还同时使用本机右值引用和Boost移动仿真实现了混合方法,以便与使用正常配置的Boost编译的代码兼容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接