C++ 11移动语义和右值引用

Ale*_*man 8 c++ visual-c++ c++11 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)
    {
    }

    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;
    }
};
Run Code Online (Sandbox Code Playgroud)

这是用法:

vector<string> tmp = StringTokenizer("123 456", ' '); //Please note the implicit conversion
Run Code Online (Sandbox Code Playgroud)

调试时发生以下情况(使用VS2013):

return转换运算符声明中

  1. container由移动构造的新向量
  2. container 被破坏了

功能返回后:

  1. tmp 由复制构造函数构造

我的问题是为什么不是tmp由移动构造函数构造的?

据我所知,函数返回类型是rvalue,应该移动.

小智 2

VS2013 不会自动生成移动构造函数/赋值。这个问题在以后的版本中得到了解决。

https://msdn.microsoft.com/en-us/library/hh567368.aspx#rvref