【问题标题】:What can I use instead of std::move()?我可以使用什么来代替 std::move()?
【发布时间】:2012-05-11 14:58:07
【问题描述】:

我正在使用具有 C++0x 规范的 C++ 编译器,并希望为环绕 std::wstring 的 String 类创建移动构造函数。

class String {
public:
    String(String&& str) : mData(std::move(str.mData)) {
    }

private:
    std::wstring mData;
};

在 Visual Studio 中,这可以完美运行。在 Xcode 中,std::move() 不可用。

【问题讨论】:

  • 这是什么编译器支持右值引用而不是std::move
  • @Prætorian : Apple LLVM 编译器 3.0
  • C++0x = C++11。如果你的意思是一个不支持std::move的编译器,写那个,不要发明一个不存在的区别会让每个人都感到困惑。
  • @KonradRudolph :我不想让任何人感到困惑——我也不认为我在发明什么。不居高临下地启发我会是更合适的回应,谢谢。
  • @ildjarn 并不是每个人都能提出适合您对问题的“完美”愿景的问题。这个问题很清楚,可以回答。

标签: c++ c++11 std rvalue-reference move-semantics


【解决方案1】:

std::move 只是将其参数转换为右值引用。您可以编写自己的版本:

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

【讨论】:

  • remove_reference 未定义。不过,我确实看过它是如何在 STL 中完成的 - 感谢您的提示!
  • @PhoenixX_2 std::move 和 std::remove_reference 是标准库的一部分。由于编译器已经知道右值引用,因此您应该简单地使用 C++11 标准库,而不是尝试实现您自己的 move()。我猜你正在使用 libstdc++,你应该考虑切换到 libc++。
  • @bames53 :我对 Xcode 不是很熟悉,我看到的唯一选项,我已经尝试过了。包装我自己的 move() 工作完美。
  • @PhoenixX_2:如果您无法让std::move 工作,那么您安装的 C++11 标准库已损坏。我建议你修复你的标准库安装,而不是实现你自己的std::move。否则你以后只会有更多的问题。我不会相信std::wstring
  • @Phoenix - 问题是如果你使用的标准库不知道move,我敢打赌wstring 无论如何都会复制字符串。如果图书馆没有移动,尝试移动也无济于事。
猜你喜欢
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多