考虑以下代码:
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
语句处
- 通过移动从
container
构造的新向量 container
被销毁
- 通过复制构造函数构造
tmp
tmp
没有使用移动构造函数构造?据我所知,函数返回类型是右值,应该被移动。
vector
:http://coliru.stacked-crooked.com/a/27aacf34fc3e22b3,而VS2013则会复制它:http://rextester.com/JEXDDD72242。 - dyp