【发布时间】:2013-03-11 18:04:19
【问题描述】:
在 C++98 中,我通常使用以下语句在迭代器的值类型中声明变量:
typename std::iterator_traits<Iterator>::value_type value;
在 C++11 中,我们有 decltype,我认为推断值类型的最简单方法是:
decltype(*iterator) value;
不幸的是,对于大多数迭代器来说,*iterator 的类型是 value_type& 而不是 value_type。任何想法,没有类型修改类,如何将上述内容按摩成产生 value_type (而不是任何参考)?
我不认为这个问题是不合理的,因为以下内容相当健壮但最终会创建另一个变量。
auto x = *iterator;
decltype(x) value;
还要注意,我真的想要 推断类型 而不仅仅是 instance 例如如果我想声明这些值的 std::vector。
【问题讨论】:
-
表达式
*iterator的类型是std::iterator_traits<Iterator>::reference,而不是value_type。这不一定是value_type&,并且decltype可能会根据其值类别报告与实际不同的表达式类型。 -
如果您只是想合并您的编辑的两行,则相当于
typename std::decay<decltype(*iterator)>::type value;,但请查看下面的答案,不要这样做: ) 我只是将其添加为std::decay之前未在此 Q/A 中提及。
标签: c++ c++11 iterator typetraits decltype