我该使用什么代替std::move()?(询问标题)

4

我正在使用符合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 - Praetorian
1
@Prætorian:苹果LLVM编译器3.0 - Mike Weir
4
C++0x = C++11。如果你的意思是指不支持std::move的编译器,就写明白,不要发明不存在的区别来困惑所有人。 - Konrad Rudolph
2
@KonradRudolph:我并不打算让任何人感到困惑,也没有认为我正在发明一些东西。如果您能毫不傲慢地启发我,那将是更合适的回应,谢谢。 - Mike Weir
1
@ildjarn 并不是每个人都能够提出符合您“完美”问题的能力。这个问题已经足够清晰,可以得到回答。 - Silidrone
显示剩余5条评论
1个回答

6

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 );
}

1
remove_reference 没有被定义。不过我查看了STL中的实现方式 - 感谢您的提示! - Mike Weir
4
@PhoenixX_2 std::move和std::remove_reference是标准库的一部分。由于编译器已经知道右值引用,因此你应该直接使用C++11标准库,而不是尝试实现自己的move()函数。我猜你可能在使用libstdc++,建议考虑切换到libc++。 - bames53
@PhoenixX_2:如果您无法使用std::move,那么您安装的C++11标准库就是损坏的。我建议您先修复标准库安装问题,而不是实现自己的std::move。否则,将来您会遇到更多问题。我也不会信任它中的std::wstring - Nicol Bolas
@NicolBolas:事情似乎进行得很顺利。我没有安装与Xcode分开的特定库。我无法更新到最新的编译器和库(其中可能有更多的规范完成),直到我更新到最新的Mac OS X,但我目前不愿意这样做。 - Mike Weir
2
@Phoenix - 问题在于,如果您使用的标准库不知道 move,我敢打赌 wstring 仍然会复制字符串。如果库没有移动操作, 尝试移动也没有用。 - Bo Persson
显示剩余3条评论

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