C++ C++;11移动语义和右值引用
考虑以下代码:C++ C++;11移动语义和右值引用,c++,c++11,visual-c++,visual-studio-2013,C++,C++11,Visual C++,Visual Studio 2013,考虑以下代码: class StringTokenizer { private: char m_delimiter; std::istringstream m_string; public: explicit StringTokenizer(const std::string& str, char delimiter) : m_string(str) , m_delimiter(delimiter) { } templ
class StringTokenizer
{
private:
char m_delimiter;
std::istringstream m_string;
public:
explicit StringTokenizer(const std::string& str, char delimiter)
: m_string(str)
, m_delimiter(delimiter)
{
}
template <class Container>
operator Container ()
{
Container container;
for (std::string token; std::getline(m_string, token, m_delimiter); )
{
container.insert(container.end(), token);
}
return container;
}
};
类StringTokenizer
{
私人:
字符m_分隔符;
std::istringstream m_字符串;
公众:
显式StringTokenizer(常量std::string&str,字符分隔符)
:m_字符串(str)
,m_分隔符(分隔符)
{
}
模板
操作员容器()
{
集装箱;
for(std::string token;std::getline(m_string,token,m_分隔符);)
{
container.insert(container.end(),token);
}
返回容器;
}
};
这是用法:
vector<string> tmp = StringTokenizer("123 456", ' '); //Please note the implicit conversion
vector tmp=StringTokenizer(“123 456”)//请注意隐式转换
调试时会发生以下情况(使用VS2013):
在转换运算符的return
语句中
容器构建的新向量
容器
被破坏tmp
由复制构造函数构造tmp
据我所知,函数返回类型为右值,应该移动。VS2013不会自动生成移动构造函数/赋值。这在以后的版本中得到了解决
Hmm g++和clang++(libstdc++和libc++)的可能副本确实移动了
向量:VS2013复制时:VS2013在显式调用转换运算符时也移动向量:VS2015也移动。我想这只是一个bug。@dyp当转换是隐式的VS2013复制而不是移动时