2014-01-04 2 views
2

кажется следующий код не компилируется под звоном (LLVM версии 5.0):Ошибка Clang с std :: function, std :: bind и std :: ref?

#include <functional> 

int main() 
{ 
    int i; 
    std::function<void(int&)> f; 
    std::function<void()> f2 = std::bind(f, std::ref(i)); 
} 

Если f объявлен следующим образом (то есть не в std::function), то она составляет штраф:

void f(int& n1); 

Я делаю что-то неправильно или это действительно ошибка компилятора?

Это ошибка компилятора я получаю:

In file included from test.cpp:1: 
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/functional:465: 
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/memory:599: 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/tuple:234:73: error: no matching constructor for initialization of 'std::__1::reference_wrapper<int>' 
      _NOEXCEPT_(is_nothrow_default_constructible<_Hp>::value) : value() 
                     ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/tuple:447:23: note: in instantiation of member function 'std::__1::__tuple_leaf<0, std::__1::reference_wrapper<int>, false>::__tuple_leaf' requested here 
    _LIBCPP_CONSTEXPR __tuple_impl() 
        ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/tuple:550:23: note: in instantiation of member function 'std::__1::__tuple_impl<std::__1::__tuple_indices<0>, std::__1::reference_wrapper<int> >::__tuple_impl' requested 
     here 
    _LIBCPP_CONSTEXPR tuple() 
        ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/functional:1744:11: note: in instantiation of member function 'std::__1::tuple<std::__1::reference_wrapper<int> >::tuple' requested here 
      __bound_args_(_VSTD::forward<_BA>(__bound_args)...) {} 
     ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/memory:2243:15: note: in instantiation of function template specialization 'std::__1::__bind<std::__1::function<void (int &)> &, std::__1::reference_wrapper<int> 
     >::__bind<std::__1::__bind<std::__1::function<void (int &)> &, std::__1::reference_wrapper<int> >, , void>' requested here 
       __first_(_VSTD::forward<_Args1>(get<_I1>(__first_args))...) 
      ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/memory:2421:15: note: in instantiation of function template specialization 'std::__1::__libcpp_compressed_pair_imp<std::__1::__bind<std::__1::function<void (int &)> &, 
     std::__1::reference_wrapper<int> >, std::__1::allocator<std::__1::__bind<std::__1::function<void (int &)> &, std::__1::reference_wrapper<int> > >, 2>::__libcpp_compressed_pair_imp<std::__1::__bind<std::__1::function<void (int &)> &, 
     std::__1::reference_wrapper<int> > &&, , 0, >' requested here 
      : base(__pc, _VSTD::move(__first_args), _VSTD::move(__second_args), 
      ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/functional:992:11: note: in instantiation of function template specialization 'std::__1::__compressed_pair<std::__1::__bind<std::__1::function<void (int &)> &, 
     std::__1::reference_wrapper<int> >, std::__1::allocator<std::__1::__bind<std::__1::function<void (int &)> &, std::__1::reference_wrapper<int> > > >::__compressed_pair<std::__1::__bind<std::__1::function<void (int &)> &, std::__1::reference_wrapper<int> > &&, >' 
     requested here 
     : __f_(piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__f)), 
     ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/functional:1277:26: note: in instantiation of member function 'std::__1::__function::__func<std::__1::__bind<std::__1::function<void (int &)> &, 
     std::__1::reference_wrapper<int> >, std::__1::allocator<std::__1::__bind<std::__1::function<void (int &)> &, std::__1::reference_wrapper<int> > >, void()>::__func' requested here 
      ::new (__f_) _FF(_VSTD::move(__f)); 
         ^
test.cpp:7:29: note: in instantiation of function template specialization 'std::__1::function<void()>::function<std::__1::__bind<std::__1::function<void (int &)> &, std::__1::reference_wrapper<int> > >' requested here 
     std::function<void()> f2 = std::bind(f, std::ref(i)); 
           ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/__functional_base:365:31: note: candidate constructor not viable: requires single argument '__f', but no arguments were provided 
    _LIBCPP_INLINE_VISIBILITY reference_wrapper(type& __f) _NOEXCEPT : __f_(&__f) {} 
          ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/__functional_base:367:14: note: candidate constructor not viable: requires 1 argument, but 0 were provided 
    private: reference_wrapper(type&&); public: // = delete; // do not bind to temps 
      ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/__functional_base:354:24: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 0 were provided 
class _LIBCPP_TYPE_VIS reference_wrapper 
        ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/__functional_base:354:24: note: candidate constructor (the implicit move constructor) not viable: requires 1 argument, but 0 were provided 
1 error generated. 
+0

Там, кажется, много других вопросов, чем тот, который вы процитировать; возможно, вам следует обратиться к ним в первую очередь. –

+1

Похож на меня. Оба GCC 4.8.1, а также [Clang] (http://coliru.stacked-crooked.com/a/932f5cb191b02492) (3.5trunk) скомпилируют его просто отлично. –

+0

@scott Какие еще проблемы? Я обновил сообщение с полным примером кода и выводом ошибки этой простой программы, чтобы было ясно, что нет другого кода, дающего проблемы. – texus

ответ

-2

Эта ошибка исправлена ​​в версии 5.1

+0

Исправить не удалось. –

+0

@ CanÜrek Этот код не компилировался, когда я использовал XCode 5.0. Я обновил XCode (и, следовательно, также clang) до 5.1, как только они его выпустили. После этого компилируется код. У меня есть проект с использованием аналогичного кода, было бы глупо объявлять, что я могу, наконец, скомпилировать мою библиотеку на mac, если она не исправлена, не так ли? У меня нет mac для проверки сейчас, но, по крайней мере, когда я разместил его, исправлена ​​ошибка. – texus

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