如何将const
限定符与decltype
用于模板 -ed函数?
目前的GCC rejects如下:
template <typename It>
bool process(It first , It last )
{
return std::all_of( first, last,
[]( const decltype(*first)& i )
// ^^^^^ without const it works fine
{
return i % 2 == 0;
}
) ;
}
在lambda中使用i
作为const
引用是否合法/可能?
答案 0 :(得分:5)
const decltype(*first)&
不起作用,因为decltype(*first)
为int&
,但您希望它为int
。您可以使用std::remove_reference
来解决这个问题(虽然它并没有真正使代码更清晰):const std::remove_reference<decltype(*first)>::type&
答案 1 :(得分:2)
只需解析为std :: iterator_traits:
#include <algorithm>
#include <iterator>
template <typename It>
bool process(It first , It last )
{
typedef typename std::iterator_traits<It>::value_type value_type;
return std::all_of(first, last, []( const value_type& i ) {
return i % 2 == 0;
});
}
int main(void) {
std::vector<int> v = { 0, 2, 4 };
process(v.begin(), v.end());
}
或没有iterator_traits:
typedef typename std::decay<decltype(*first)>::type value_type;
导致:const限定符对于引用毫无意义,并且const decltype(*first)&)
给出了一个虚假的承诺,即具有不可变参数,这实际上是可变的。
答案 2 :(得分:2)
你可以add_const:
template <typename It>
bool process(It first , It last )
{
// std::cout << "Typeid :" << typeid( const decltype(*begin) &).name( ) << '\n' ;
return std::all_of( first, last,
[]( typename add_const<decltype(*first)>::type &i )
{ // ^^^^^^^^^
return i % 2 == 0;
}
) ;
}