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

8

考虑以下代码:

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

这是使用方法:

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

当进行以下操作时进行调试(使用VS2013):
在转换运算符的return语句处
  1. 通过移动从container构造的新向量
  2. container被销毁
函数返回后:
  1. 通过复制构造函数构造tmp
我的问题是为什么tmp没有使用移动构造函数构造?
据我所知,函数返回类型是右值,应该被移动。

2
哦,g++和clang++(libstdc++和libc++)确实会移动vector:http://coliru.stacked-crooked.com/a/27aacf34fc3e22b3,而VS2013则会复制它:http://rextester.com/JEXDDD72242。 - dyp
1
VS2015也会出现移动的情况。我猜这只是一个bug。 - T.C.
@dyp 当转换是隐式的时,VS2013会进行复制而不是移动。 - Alejandro Freeman
@AlejandroFreeman 我知道,只是我不理解。T.C.可能是对的,这看起来像是一个bug。 - dyp
显示剩余2条评论
1个回答

2

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