Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;11移动语义和右值引用_C++_C++11_Visual C++_Visual Studio 2013 - Fatal编程技术网

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复制而不是移动时