如何将const限定符与decltype一起使用?

时间:2014-06-08 08:29:03

标签: c++ c++11

如何将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引用是否合法/可能?

3 个答案:

答案 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; 
                       } 
                     ) ;
}