gpt4 book ai didi

C++11 字符串赋值运算符

转载 作者:太空狗 更新时间:2023-10-29 23:30:38 32 4
gpt4 key购买 nike

看这段代码:

#include <iostream>
#include <algorithm>
#include <fstream>
#include <iterator>

using namespace std;

int main()
{
ifstream text("text.txt");

istreambuf_iterator<char> iis(text);
string longest_phrase, _longest;

while (iis != istreambuf_iterator<char>()) {
if ( *iis != '.' ) {
_longest.push_back(*iis);
++iis;
continue;
}
if ( _longest.size() > longest_phrase.size() )
longest_phrase = move(_longest); //I want to move the data of _longest to longest_phrase. Just move! Not to copy!
cout << _longest.empty(); //why _longest is not empty??
//_longest.clear();
++iis;
}
text.close();
longest_phrase.push_back('.');
cout << "longest phrase is " << longest_phrase;
return 0;
}

此代码搜索文件中最长的短语。那么为什么从左值到右值的转换不起作用呢?

编辑:这就是为什么我认为它不起作用:

class Vector {
public:
Vector(vector<int> &&v): vec( move(v) ) {}
vector<int> vec;
};

int main()
{
vector<int> ints(50, 44);
Vector obj( move(ints) );
cout << ints.empty();
return 0;
}

感谢大家快速而有用的回答!

最佳答案

你不应该对标准库的移出对象的状态做出具体假设,除了它是合法状态这一事实(除非指定了移动赋值运算符或移动构造函数的进一步后置条件).

根据 C++11 标准的第 17.6.5.15 段:

Objects of types defined in the C++ standard library may be moved from (12.8). Move operations may be explicitly specified or implicitly generated. Unless otherwise specified, such moved-from objects shall be placed in a valid but unspecified state.

此外,关于 basic_string 类模板的移动赋值运算符的第 21.4.2/21-23 段没有指定任何有关移动字符串是否应处于这样的状态的信息:对其调用 empty() 会返回 true

在这种情况下调用 empty() 是合法的,因为它对调用它的 string 对象的状态没有任何先决条件;另一方面,你不能假设它的返回值应该是多少。

关于C++11 字符串赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16479281/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com