求助!!decltype的区别用法,谢谢各位大神啦

Dmbear 2016-03-20 10:33:59
主要是我看书看到有些函数里的循环直接就是
string::size_type MyString(const int &s)
{
string::size_type word = s.size();
for (decltype(s.size()) index = 0; index != word; ++index)
{
.。。。。。。。
}
return;
}
和!!!!!
string::size_type MyString(const int &s)
{
for (decltype(s) index = 0; index != s.size(); ++index)
{
.。。。。。。。
}
return;
}
我有点搞不清楚这两个循环里的decltype推导表达式的类型 性质是一样的么,然后我看的一般后面都是不等于 .size()为什么上面第一个例子却可以直接不等于那个。
...全文
146 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dmbear 2016-03-20
  • 打赏
  • 举报
回复
引用 13 楼 sdghchj 的回复:
[quote=引用 12 楼 qq_33547203 的回复:] [quote=引用 11 楼 sdghchj 的回复:] [quote=引用 7 楼 qq_33547203 的回复:] [quote=引用 4 楼 sdghchj 的回复:] decltype推断出的类型包括const和引用修饰噢,所以const int &s; decltype(s) index = 0就相当于const int& index= 0;那么后面的++index就不行了。
呃呃呃抱歉不是很懂也,[/quote] const修饰的变量不能被修改,所以++index会报错。[/quote]好像是那么回事!突然懂了!对了那个函数好像打错了 就是函数里面形参是const string &s的话呢,①index != s.size() 和 ②(循环外string::size_type word = s.size())index != word; ①和②应该是等价的吧?[/quote] 一般仅仅是遍历(不对vector进行增加或删除,即不改变其size)的情况下,当然是等价的。这个问题并不是循环内外的问题,而是你要弄明白for循环的执行过程,每次执行之前都会判断逻辑表达式一次,为真才执行。 [/quote]感谢!我懂了
sdghchj 2016-03-20
  • 打赏
  • 举报
回复
引用 12 楼 qq_33547203 的回复:
[quote=引用 11 楼 sdghchj 的回复:] [quote=引用 7 楼 qq_33547203 的回复:] [quote=引用 4 楼 sdghchj 的回复:] decltype推断出的类型包括const和引用修饰噢,所以const int &s; decltype(s) index = 0就相当于const int& index= 0;那么后面的++index就不行了。
呃呃呃抱歉不是很懂也,[/quote] const修饰的变量不能被修改,所以++index会报错。[/quote]好像是那么回事!突然懂了!对了那个函数好像打错了 就是函数里面形参是const string &s的话呢,①index != s.size() 和 ②(循环外string::size_type word = s.size())index != word; ①和②应该是等价的吧?[/quote] 一般仅仅是遍历(不对vector进行增加或删除,即不改变其size)的情况下,当然是等价的。这个问题并不是循环内外的问题,而是你要弄明白for循环的执行过程,每次执行之前都会判断逻辑表达式一次,为真才执行。
Dmbear 2016-03-20
  • 打赏
  • 举报
回复
引用 11 楼 sdghchj 的回复:
[quote=引用 7 楼 qq_33547203 的回复:] [quote=引用 4 楼 sdghchj 的回复:] decltype推断出的类型包括const和引用修饰噢,所以const int &s; decltype(s) index = 0就相当于const int& index= 0;那么后面的++index就不行了。
呃呃呃抱歉不是很懂也,[/quote] const修饰的变量不能被修改,所以++index会报错。[/quote]好像是那么回事!突然懂了!对了那个函数好像打错了 就是函数里面形参是const string &s的话呢,①index != s.size() 和 ②(循环外string::size_type word = s.size())index != word; ①和②应该是等价的吧?
sdghchj 2016-03-20
  • 打赏
  • 举报
回复
引用 7 楼 qq_33547203 的回复:
[quote=引用 4 楼 sdghchj 的回复:] decltype推断出的类型包括const和引用修饰噢,所以const int &s; decltype(s) index = 0就相当于const int& index= 0;那么后面的++index就不行了。
呃呃呃抱歉不是很懂也,[/quote] const修饰的变量不能被修改,所以++index会报错。
sdghchj 2016-03-20
  • 打赏
  • 举报
回复
引用 8 楼 qq_33547203 的回复:
[quote=引用 6 楼 sdghchj 的回复:] [quote=引用 3 楼 qq_33547203 的回复:] 还有一个问题需要求助 = =。。三个问题有点麻烦噢 求大神解答帮帮忙谢啦 会加分哒 vector<int>::iterator和vector<int>::size_type又有什么区别呢 const vector<int>::iterator和vector<int>::const_iterator
vector<int>::iterator是迭带器,作用相当于指针;vector<int>::size_type实际上就是size_t,也就是unsigned int,在vector中size_type实际上是size_t的别名,用typedef定义的。 const vector<int>::iterator和vector<int>::const_iterator是一样的,等价的,也是通过typedef定义的。STL源代码上都有的。 [/quote]噢噢这个懂啦谢啦!!不过第一个问题循环里面是等价的吗,就是我第一个问题的两个循环里面 好像表达式不同,但我觉得应该是等价的吧[/quote] 你给的代码里都是用的索引啊,没有用迭带器,而且传入参数s是const int。。。哪来的s.size()??????????????
sdghchj 2016-03-20
  • 打赏
  • 举报
回复
引用 3 楼 qq_33547203 的回复:
还有一个问题需要求助 = =。。三个问题有点麻烦噢 求大神解答帮帮忙谢啦 会加分哒 vector<int>::iterator和vector<int>::size_type又有什么区别呢
vector<int>::iterator是用来在vector<int>::begin()到vector<int>::end()之间进行迭带遍历的,相当于指针对数组的遍历。 vector<int>::size_type是指vector索引下标类型,是在0到vector<int>::size()之间用索引去遍历。
sdghchj 2016-03-20
  • 打赏
  • 举报
回复
引用 3 楼 qq_33547203 的回复:
还有一个问题需要求助 = =。。三个问题有点麻烦噢 求大神解答帮帮忙谢啦 会加分哒 vector<int>::iterator和vector<int>::size_type又有什么区别呢 const vector<int>::iterator和vector<int>::const_iterator
vector<int>::iterator是迭带器,作用相当于指针;vector<int>::size_type实际上就是size_t,也就是unsigned int,在vector中size_type实际上是size_t的别名,用typedef定义的。 const vector<int>::iterator和vector<int>::const_iterator是一样的,等价的,也是通过typedef定义的。STL源代码上都有的。
Dmbear 2016-03-20
  • 打赏
  • 举报
回复
引用 6 楼 sdghchj 的回复:
[quote=引用 3 楼 qq_33547203 的回复:] 还有一个问题需要求助 = =。。三个问题有点麻烦噢 求大神解答帮帮忙谢啦 会加分哒 vector<int>::iterator和vector<int>::size_type又有什么区别呢 const vector<int>::iterator和vector<int>::const_iterator
vector<int>::iterator是迭带器,作用相当于指针;vector<int>::size_type实际上就是size_t,也就是unsigned int,在vector中size_type实际上是size_t的别名,用typedef定义的。 const vector<int>::iterator和vector<int>::const_iterator是一样的,等价的,也是通过typedef定义的。STL源代码上都有的。 [/quote]噢噢这个懂啦谢啦!!不过第一个问题循环里面是等价的吗,就是我第一个问题的两个循环里面 好像表达式不同,但我觉得应该是等价的吧
Dmbear 2016-03-20
  • 打赏
  • 举报
回复
引用 4 楼 sdghchj 的回复:
decltype推断出的类型包括const和引用修饰噢,所以const int &s; decltype(s) index = 0就相当于const int& index= 0;那么后面的++index就不行了。
呃呃呃抱歉不是很懂也,
Dmbear 2016-03-20
  • 打赏
  • 举报
回复
引用 2 楼 D41D8CD98F 的回复:
暂且不要用咯。见得多了,自己实现过的功能多了,就迟早会知道为什么那么多人喜欢 auto 和 decltype
额就是说我现在不必这么深究咯?
sdghchj 2016-03-20
  • 打赏
  • 举报
回复
decltype推断出的类型包括const和引用修饰噢,所以const int &s; decltype(s) index = 0就相当于const int& index= 0;那么后面的++index就不行了。
Dmbear 2016-03-20
  • 打赏
  • 举报
回复
还有一个问题需要求助 = =。。三个问题有点麻烦噢 求大神解答帮帮忙谢啦 会加分哒 vector<int>::iterator和vector<int>::size_type又有什么区别呢 const vector<int>::iterator和vector<int>::const_iterator
D41D8CD98F 2016-03-20
  • 打赏
  • 举报
回复
暂且不要用咯。见得多了,自己实现过的功能多了,就迟早会知道为什么那么多人喜欢 auto 和 decltype
Dmbear 2016-03-20
  • 打赏
  • 举报
回复
还有我去网上找了好多auto和decltype的区别,好像说的是auto是推测出来变量的类型并且自动把改条语句使用auto声明的变量也变成该推测的类型,而decltype则是推测了不使用???我有点不明白,我感觉性质都大体相同啊。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧