2014-09-20 2 views
2

Мой компилятор gcc-4.9 и компилирую с -std=c++14. У меня есть следующий код, который не компилируется.Использование Generic Lambda с std :: find_if

set<int> pal; 
set<tuple<int, int, int>> pal_group; 

// ... populate pal & pal_group 

auto itr_pal = max_element(pal.begin(), pal.end()); 
auto itr_pal_group = 
    find_if(
     pal_group.begin(), pal_group.end(), [&itr_pal] (auto pal_tuple) { 
      return true; 
     } 
    ); 

Однако приведенный выше код будет компилироваться как только я начинаю на самом деле использовать pal_tuple. , например.

 find_if(
     pal_group.begin(), pal_group.end(), [&itr_pal] (auto pal_tuple) { 
      int pal; 
      tie(pal, ignore, ignore) = pal_tuple; 
      return pal == *itr_pal; 
     } 
    ); 

Мои подозрения в том, что компилятор не может выяснить тип pal_tuple без меня на самом деле использовать его как tuple<int, int, int>. Однако прототип унарного предиката, по-видимому, указывает, что тип pal_tuple может состоять только в том, что вариант tuple<int, int, int> (например, const, const T& и т. Д.)?

Следующая от cpprefernece.com:

The signature of the predicate function should be equivalent to the following: 

    bool pred(const Type &a); 

The signature does not need to have const &, but the function must not modify the objects passed to it. 
The type Type must be such that an object of type InputIt can be dereferenced and then implicitly converted to Type. ​ 

Я хотел бы узнать, почему компилятор не может выяснить тип pal_tuple без меня на самом деле его использования.

Спасибо,

Edit: Это ошибка ... Так что компилятор фактически только дает мне предупреждения, но я думал, что это была ошибка. Я буду более осторожным в будущем, прежде чем отправлять вопросы ...

g++-4.9 -std=c++14 -Wall -Wextra p4.cpp -o p4.exec 
p4.cpp: In instantiation of 'main()::<lambda(auto:1)> [with auto:1 = std::tuple<int, int, int>]': 
/usr/local/Cellar/gcc49/4.9.1/lib/gcc/x86_64-apple-darwin13.3.0/4.9.1/include/c++/bits/predefined_ops.h:231:30: required from 'bool __gnu_cxx::__ops::_Iter_pred<_Predicate>::operator()(_Iterator) [with _Iterator = std::_Rb_tree_const_iterator<std::tuple<int, int, int> >; _Predicate = main()::<lambda(auto:1)>]' 
/usr/local/Cellar/gcc49/4.9.1/lib/gcc/x86_64-apple-darwin13.3.0/4.9.1/include/c++/bits/stl_algo.h:104:50: required from '_InputIterator std::__find_if(_InputIterator, _InputIterator, _Predicate, std::input_iterator_tag) [with _InputIterator = std::_Rb_tree_const_iterator<std::tuple<int, int, int> >; _Predicate = __gnu_cxx::__ops::_Iter_pred<main()::<lambda(auto:1)> >]' 
/usr/local/Cellar/gcc49/4.9.1/lib/gcc/x86_64-apple-darwin13.3.0/4.9.1/include/c++/bits/stl_algo.h:162:43: required from '_Iterator std::__find_if(_Iterator, _Iterator, _Predicate) [with _Iterator = std::_Rb_tree_const_iterator<std::tuple<int, int, int> >; _Predicate = __gnu_cxx::__ops::_Iter_pred<main()::<lambda(auto:1)> >]' 
/usr/local/Cellar/gcc49/4.9.1/lib/gcc/x86_64-apple-darwin13.3.0/4.9.1/include/c++/bits/stl_algo.h:3804:45: required from '_IIter std::find_if(_IIter, _IIter, _Predicate) [with _IIter = std::_Rb_tree_const_iterator<std::tuple<int, int, int> >; _Predicate = main()::<lambda(auto:1)>]' 
p4.cpp:49:9: required from here 
p4.cpp:41:66: warning: unused parameter 'pal_tuple' [-Wunused-parameter] 
      pal_group.begin(), pal_group.end(), [&itr_pal] (auto pal_tuple) { 
                   ^
+0

@ Дедупликатор, хм .. похоже, что он обычно известен как родовые лямбды. Когда я впервые прочитал предложение об общей лямбде, я думаю, что это называется Полиморфной лямбдой ... Я исправлю название. –

+0

Работает отлично в Clang ... –

+0

@KerrekSB, какую версию Clang вы используете? Мой clang, похоже, не принимает '-std = C++ 14' ... –

ответ

2

Ваш код и действителен, и скомпилирован с GCC 4.9, когда я попробовал это (за исключением некоторых предупреждений). Ваша проблема заключается не в размещенном коде, а в другом месте.

В будущем, пожалуйста, опубликуйте фактическое сообщение об ошибке и на самом деле введите код, который вы публикуете в свой компилятор, и посмотрите, как ваш компилятор генерирует указанную ошибку.

+0

Это была моя ошибка, компилятор только дал мне предупреждения, но я воспринял это как ошибку ... Я буду более осторожным в будущем перед отправкой вопросов. –

Смежные вопросы