我正在使用符合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()
不可用。我正在使用符合C++0x规范的C++编译器,想要为一个封装了std::wstring的String类编写移动构造函数。
class String {
public:
String(String&& str) : mData(std::move(str.mData)) {
}
private:
std::wstring mData;
};
std::move()
不可用。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中的实现方式 - 感谢您的提示! - Mike Weirmove()
函数。我猜你可能在使用libstdc++,建议考虑切换到libc++。 - bames53std::move
,那么您安装的C++11标准库就是损坏的。我建议您先修复标准库安装问题,而不是实现自己的std::move
。否则,将来您会遇到更多问题。我也不会信任它中的std::wstring
。 - Nicol Bolasmove
,我敢打赌 wstring
仍然会复制字符串。如果库没有移动操作,您 尝试移动也没有用。 - Bo Persson
std::move
? - Praetorianstd::move
的编译器,就写明白,不要发明不存在的区别来困惑所有人。 - Konrad Rudolph