| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3251 人关注过本帖
标题:用remove去除iterator中的const属性问题
取消只看楼主 加入收藏
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
结帖率:95.37%
收藏
已结贴  问题点数:20 回复次数:6 
用remove去除iterator中的const属性问题
#include <iostream>
#include <type_traits>
using namespace std;

int main()
{
    string s="123456";
    string::iterator it=remove_const<s.begin()>::type ;
    return 0;
}
s.begin()返回一个临时变量,是一个右值,它不能赋值给一个非const的引用:所以我想要把他的const属性去掉。


[此贴子已经被作者于2018-12-24 22:34编辑过]

搜索更多相关主题的帖子: iterator const 属性 include string 
2018-12-24 22:30
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 2楼 rjsp
因为s.begin()返回的值不是带有const属性吗。想把s.begin()只用的const属性去掉。
2018-12-25 12:46
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
#include <iostream>
#include <type_traits>
using namespace std;

void f(string::iterator &it)
{
    ++it;
}
int main()
{
    string s="123456";
    f(s.begin());//这行出错,
    return 0;
}
[Error] invalid initialization of non-const reference of type 'std::basic_string<char>::iterator& {aka __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&}' from an rvalue of type 'std::basic_string<char>::iterator {aka __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >}'

[Note] in passing argument 1 of 'void f(std::basic_string<char>::iterator&)'
我百度的原因说是因为s.begin()返回的iterator带const,把const属性去掉即可。https://blog.

在STL中,我们能见到很多函数的形参都是iterator的传值,而不是传引用。
这是因为我们通常这么用:
void print_vector(vector<int>::iterator beg, vector<int>::itertor end);
while(beg != end) { cout << *beg++ << endl; }
print_vector(v.begin(), v.end());
这里形参如果是引用的话,则编译时会报错,因为v.begin()返回的是一个临时变量,是一个右值,它不能赋值给一个非const的引用:
error: invalid initialization of non-const reference of type 'std::vector<int>::iterator& {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >&}' from an rvalue of type 'std::vector<int>::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >}'
但可以赋值给const 引用;即如果print_vector的形参是const的iterator,就可以传v.begin()给它。但这样一来,在函数体内就不能做++,--或任何修改该iterator的操作了。
这就是iterator一般用传值的原因。
类似的道理,函数的返回值通常不能传给一个非const的引用,因为函数返回值通常也是一个临时变量,是一个右值。
int f() { return 1; }
int &ri1 = f();            //error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'
const int &ri2 = f();   // OK
2018-12-25 19:35
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 6楼 rjsp
是不是没法在函数的参数列表里调用iterator的引用了?例如:
void f(string::iterator &it)
{
    ++it;
}
2018-12-25 20:27
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
以下是引用Jonny0201在2018-12-25 20:34:17的发言:

对于 string::iterator 和 string::const_iterator
对他们的 const 限定是假的
他们没有 const 限定
string::iterator 的原型在 libcpp 里面是 __wrap_iterator<char *>
string::const_iterator 的原型是 __wrap_iterator<const char *>


string::const_iterator 的原型是 __wrap_iterator<const char *>中的const char *不是用const限定了指针指向元素不能改变吗?
2018-12-25 21:10
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
以下是引用Jonny0201在2018-12-25 20:37:49的发言:

这个就相当于 C 的指针, 有一个左值就行了


    string str {"12345"};
    auto iterator {str.begin()};
    func(iterator);

这里为什么把str.begin()付给一个左值,然后函数中调用左值就可以了呢?

这种初始化的方式string str {"12345"};和这种string str ("12345");string str="12345";有什么区别没?
2018-12-25 21:12
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 13楼 rjsp
好的 明白了 谢谢。
2018-12-26 10:07
快速回复:用remove去除iterator中的const属性问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016316 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved