2017-03-10 16 views
2

std::bind을 호출하여 std::reference_wrapper::get을 호출하려고하는데 컴파일 할 수 없습니다. 나는 명백한 것을 간과하고 있지만 컴파일러 에러가 나를 도와주지 않는다고 확신한다. 이 코드는 인위적이고 내 실제 사용 사례 나타내지 않는 :std :: bind with std :: reference_wrapper :: get

#include <functional> 
#include <iostream> 

struct A 
{ 
    void p() {std::cout << this << '\n';}; 
}; 

using ARef = std::reference_wrapper<A>; 

int main() 
{ 
    A a; 
    a.p(); 
    auto p = std::bind (&A::p, std::placeholders::_1); 
    p (a); // ok 

    ARef ar (a); 
    p (ar.get()); // ok 
    auto get = std::bind (&ARef::get, std::placeholders::_1); 
    p (get (ar)); // error 
} 

편집 : 이것은 그 소리 괜찮 컴파일합니다.

GCC 6.3.0 출력 :http://coliru.stacked-crooked.com/a/00bffc7549193cb8

main.cpp: In function 'int main()': 
main.cpp:21:19: error: no match for call to '(std::_Bind<std::_Mem_fn<A& (std::reference_wrapper<A>::*)() const noexcept>(std::_Placeholder<1>)>) (ARef&)' 
     p (get (ar)); // error 
       ^
In file included from main.cpp:1:0: 
/usr/local/include/c++/6.3.0/functional:989:2: note: candidate: template<class ... _Args, class _Result> _Result std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args&& ...) [with _Args = {_Args ...}; _Result = _Result; _Functor = std::_Mem_fn<A& (std::reference_wrapper<A>::*)() const noexcept>; _Bound_args = {std::_Placeholder<1>}] 
    operator()(_Args&&... __args) 
    ^~~~~~~~ 
/usr/local/include/c++/6.3.0/functional:989:2: note: template argument deduction/substitution failed: 
/usr/local/include/c++/6.3.0/functional:985:39: error: no match for call to '(std::_Mem_fn<A& (std::reference_wrapper<A>::*)() const noexcept>) (std::reference_wrapper<A>&)' 
    = decltype(std::declval<_Functor&>()(
       ~~~~~~~~~~~~~~~~~~~~~~~~~^ 
     _Mu<_Bound_args>()(std::declval<_Bound_args&>(), 
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     std::declval<tuple<_Args...>&>())...))> 
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
/usr/local/include/c++/6.3.0/functional:600:2: note: candidate: template<class ... _Args> decltype (std::__invoke(((const std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>*)this)->std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::_M_pmf, (forward<_Args>)(std::_Mem_fn_base::operator()::__args)...)) std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::operator()(_Args&& ...) const [with _Args = {_Args ...}; _MemFunPtr = A& (std::reference_wrapper<A>::*)() const noexcept; bool __is_mem_fn = true] 
    operator()(_Args&&... __args) const 
    ^~~~~~~~ 
/usr/local/include/c++/6.3.0/functional:600:2: note: template argument deduction/substitution failed: 
/usr/local/include/c++/6.3.0/functional: In substitution of 'template<class ... _Args> decltype (std::__invoke(((const std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>*)this)->std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::_M_pmf, (forward<_Args>)(std::_Mem_fn_base::operator()::__args)...)) std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::operator()(_Args&& ...) const [with _Args = {std::reference_wrapper<A>&}]': 
/usr/local/include/c++/6.3.0/functional:985:39: required from here 
/usr/local/include/c++/6.3.0/functional:603:27: error: no matching function for call to '__invoke(A& (std::reference_wrapper<A>::* const&)() const noexcept, std::reference_wrapper<A>&)' 
    -> decltype(std::__invoke(_M_pmf, std::forward<_Args>(__args)...)) 
       ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
/usr/local/include/c++/6.3.0/functional:245:5: note: candidate: template<class _Callable, class ... _Args> typename std::result_of<_Callable&&(_Args&& ...)>::type std::__invoke(_Callable&&, _Args&& ...) 
    __invoke(_Callable&& __fn, _Args&&... __args) 
    ^~~~~~~~ 
/usr/local/include/c++/6.3.0/functional:245:5: note: template argument deduction/substitution failed: 
/usr/local/include/c++/6.3.0/functional: In substitution of 'template<class _Callable, class ... _Args> typename std::result_of<_Callable&&(_Args&& ...)>::type std::__invoke(_Callable&&, _Args&& ...) [with _Callable = A& (std::reference_wrapper<A>::* const&)() const noexcept; _Args = {std::reference_wrapper<A>&}]': 
/usr/local/include/c++/6.3.0/functional:603:27: required by substitution of 'template<class ... _Args> decltype (std::__invoke(((const std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>*)this)->std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::_M_pmf, (forward<_Args>)(std::_Mem_fn_base::operator()::__args)...)) std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::operator()(_Args&& ...) const [with _Args = {std::reference_wrapper<A>&}]' 
/usr/local/include/c++/6.3.0/functional:985:39: required from here 
/usr/local/include/c++/6.3.0/functional:245:5: error: no type named 'type' in 'class std::result_of<A& (std::reference_wrapper<A>::* const&(std::reference_wrapper<A>&))() const noexcept>' 
/usr/local/include/c++/6.3.0/functional:1003:2: note: candidate: template<class ... _Args, class _Result> _Result std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args&& ...) const [with _Args = {_Args ...}; _Result = _Result; _Functor = std::_Mem_fn<A& (std::reference_wrapper<A>::*)() const noexcept>; _Bound_args = {std::_Placeholder<1>}] 
    operator()(_Args&&... __args) const 
    ^~~~~~~~ 
/usr/local/include/c++/6.3.0/functional:1003:2: note: template argument deduction/substitution failed: 
/usr/local/include/c++/6.3.0/functional:999:53: error: no match for call to '(const std::_Mem_fn<A& (std::reference_wrapper<A>::*)() const noexcept>) (std::reference_wrapper<A>&)' 
    = decltype(std::declval<typename enable_if<(sizeof...(_Args) >= 0), 
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
      typename add_const<_Functor>::type&>::type>()(
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~ 
/usr/local/include/c++/6.3.0/functional:600:2: note: candidate: template<class ... _Args> decltype (std::__invoke(((const std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>*)this)->std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::_M_pmf, (forward<_Args>)(std::_Mem_fn_base::operator()::__args)...)) std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::operator()(_Args&& ...) const [with _Args = {_Args ...}; _MemFunPtr = A& (std::reference_wrapper<A>::*)() const noexcept; bool __is_mem_fn = true] 
    operator()(_Args&&... __args) const 
    ^~~~~~~~ 
/usr/local/include/c++/6.3.0/functional:600:2: note: template argument deduction/substitution failed: 
/usr/local/include/c++/6.3.0/functional: In substitution of 'template<class ... _Args> decltype (std::__invoke(((const std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>*)this)->std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::_M_pmf, (forward<_Args>)(std::_Mem_fn_base::operator()::__args)...)) std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::operator()(_Args&& ...) const [with _Args = {std::reference_wrapper<A>&}]': 
/usr/local/include/c++/6.3.0/functional:999:53: required from here 
/usr/local/include/c++/6.3.0/functional:603:27: error: no matching function for call to '__invoke(A& (std::reference_wrapper<A>::* const&)() const noexcept, std::reference_wrapper<A>&)' 
    -> decltype(std::__invoke(_M_pmf, std::forward<_Args>(__args)...)) 
       ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
/usr/local/include/c++/6.3.0/functional:245:5: note: candidate: template<class _Callable, class ... _Args> typename std::result_of<_Callable&&(_Args&& ...)>::type std::__invoke(_Callable&&, _Args&& ...) 
    __invoke(_Callable&& __fn, _Args&&... __args) 
    ^~~~~~~~ 
/usr/local/include/c++/6.3.0/functional:245:5: note: template argument deduction/substitution failed: 
/usr/local/include/c++/6.3.0/functional: In substitution of 'template<class _Callable, class ... _Args> typename std::result_of<_Callable&&(_Args&& ...)>::type std::__invoke(_Callable&&, _Args&& ...) [with _Callable = A& (std::reference_wrapper<A>::* const&)() const noexcept; _Args = {std::reference_wrapper<A>&}]': 
/usr/local/include/c++/6.3.0/functional:603:27: required by substitution of 'template<class ... _Args> decltype (std::__invoke(((const std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>*)this)->std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::_M_pmf, (forward<_Args>)(std::_Mem_fn_base::operator()::__args)...)) std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::operator()(_Args&& ...) const [with _Args = {std::reference_wrapper<A>&}]' 
/usr/local/include/c++/6.3.0/functional:999:53: required from here 
/usr/local/include/c++/6.3.0/functional:245:5: error: no type named 'type' in 'class std::result_of<A& (std::reference_wrapper<A>::* const&(std::reference_wrapper<A>&))() const noexcept>' 
/usr/local/include/c++/6.3.0/functional:1017:2: note: candidate: template<class ... _Args, class _Result> _Result std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args&& ...) volatile [with _Args = {_Args ...}; _Result = _Result; _Functor = std::_Mem_fn<A& (std::reference_wrapper<A>::*)() const noexcept>; _Bound_args = {std::_Placeholder<1>}] 
    operator()(_Args&&... __args) volatile 
    ^~~~~~~~ 
/usr/local/include/c++/6.3.0/functional:1017:2: note: template argument deduction/substitution failed: 
/usr/local/include/c++/6.3.0/functional:1013:70: error: no match for call to '(volatile std::_Mem_fn<A& (std::reference_wrapper<A>::*)() const noexcept>) (std::reference_wrapper<A>&)' 
    = decltype(std::declval<typename enable_if<(sizeof...(_Args) >= 0), 
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
         typename add_volatile<_Functor>::type&>::type>()(
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~ 
/usr/local/include/c++/6.3.0/functional:600:2: note: candidate: template<class ... _Args> decltype (std::__invoke(((const std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>*)this)->std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::_M_pmf, (forward<_Args>)(std::_Mem_fn_base::operator()::__args)...)) std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::operator()(_Args&& ...) const [with _Args = {_Args ...}; _MemFunPtr = A& (std::reference_wrapper<A>::*)() const noexcept; bool __is_mem_fn = true] 
    operator()(_Args&&... __args) const 
    ^~~~~~~~ 
/usr/local/include/c++/6.3.0/functional:600:2: note: template argument deduction/substitution failed: 
/usr/local/include/c++/6.3.0/functional: In substitution of 'template<class ... _Args> decltype (std::__invoke(((const std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>*)this)->std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::_M_pmf, (forward<_Args>)(std::_Mem_fn_base::operator()::__args)...)) std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::operator()(_Args&& ...) const [with _Args = {std::reference_wrapper<A>&}]': 
/usr/local/include/c++/6.3.0/functional:1013:70: required from here 
/usr/local/include/c++/6.3.0/functional:603:27: error: no matching function for call to '__invoke(A& (std::reference_wrapper<A>::* const&)() const noexcept, std::reference_wrapper<A>&)' 
    -> decltype(std::__invoke(_M_pmf, std::forward<_Args>(__args)...)) 
       ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
/usr/local/include/c++/6.3.0/functional:245:5: note: candidate: template<class _Callable, class ... _Args> typename std::result_of<_Callable&&(_Args&& ...)>::type std::__invoke(_Callable&&, _Args&& ...) 
    __invoke(_Callable&& __fn, _Args&&... __args) 
    ^~~~~~~~ 
/usr/local/include/c++/6.3.0/functional:245:5: note: template argument deduction/substitution failed: 
/usr/local/include/c++/6.3.0/functional: In substitution of 'template<class _Callable, class ... _Args> typename std::result_of<_Callable&&(_Args&& ...)>::type std::__invoke(_Callable&&, _Args&& ...) [with _Callable = A& (std::reference_wrapper<A>::* const&)() const noexcept; _Args = {std::reference_wrapper<A>&}]': 
/usr/local/include/c++/6.3.0/functional:603:27: required by substitution of 'template<class ... _Args> decltype (std::__invoke(((const std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>*)this)->std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::_M_pmf, (forward<_Args>)(std::_Mem_fn_base::operator()::__args)...)) std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::operator()(_Args&& ...) const [with _Args = {std::reference_wrapper<A>&}]' 
/usr/local/include/c++/6.3.0/functional:1013:70: required from here 
/usr/local/include/c++/6.3.0/functional:245:5: error: no type named 'type' in 'class std::result_of<A& (std::reference_wrapper<A>::* const&(std::reference_wrapper<A>&))() const noexcept>' 
/usr/local/include/c++/6.3.0/functional:1031:2: note: candidate: template<class ... _Args, class _Result> _Result std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args&& ...) const volatile [with _Args = {_Args ...}; _Result = _Result; _Functor = std::_Mem_fn<A& (std::reference_wrapper<A>::*)() const noexcept>; _Bound_args = {std::_Placeholder<1>}] 
    operator()(_Args&&... __args) const volatile 
    ^~~~~~~~ 
/usr/local/include/c++/6.3.0/functional:1031:2: note: template argument deduction/substitution failed: 
/usr/local/include/c++/6.3.0/functional:1027:64: error: no match for call to '(const volatile std::_Mem_fn<A& (std::reference_wrapper<A>::*)() const noexcept>) (std::reference_wrapper<A>&)' 
    = decltype(std::declval<typename enable_if<(sizeof...(_Args) >= 0), 
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
         typename add_cv<_Functor>::type&>::type>()(
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~ 
/usr/local/include/c++/6.3.0/functional:600:2: note: candidate: template<class ... _Args> decltype (std::__invoke(((const std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>*)this)->std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::_M_pmf, (forward<_Args>)(std::_Mem_fn_base::operator()::__args)...)) std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::operator()(_Args&& ...) const [with _Args = {_Args ...}; _MemFunPtr = A& (std::reference_wrapper<A>::*)() const noexcept; bool __is_mem_fn = true] 
    operator()(_Args&&... __args) const 
    ^~~~~~~~ 
/usr/local/include/c++/6.3.0/functional:600:2: note: template argument deduction/substitution failed: 
/usr/local/include/c++/6.3.0/functional: In substitution of 'template<class ... _Args> decltype (std::__invoke(((const std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>*)this)->std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::_M_pmf, (forward<_Args>)(std::_Mem_fn_base::operator()::__args)...)) std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::operator()(_Args&& ...) const [with _Args = {std::reference_wrapper<A>&}]': 
/usr/local/include/c++/6.3.0/functional:1027:64: required from here 
/usr/local/include/c++/6.3.0/functional:603:27: error: no matching function for call to '__invoke(A& (std::reference_wrapper<A>::* const&)() const noexcept, std::reference_wrapper<A>&)' 
    -> decltype(std::__invoke(_M_pmf, std::forward<_Args>(__args)...)) 
       ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
/usr/local/include/c++/6.3.0/functional:245:5: note: candidate: template<class _Callable, class ... _Args> typename std::result_of<_Callable&&(_Args&& ...)>::type std::__invoke(_Callable&&, _Args&& ...) 
    __invoke(_Callable&& __fn, _Args&&... __args) 
    ^~~~~~~~ 
/usr/local/include/c++/6.3.0/functional:245:5: note: template argument deduction/substitution failed: 
/usr/local/include/c++/6.3.0/functional: In substitution of 'template<class _Callable, class ... _Args> typename std::result_of<_Callable&&(_Args&& ...)>::type std::__invoke(_Callable&&, _Args&& ...) [with _Callable = A& (std::reference_wrapper<A>::* const&)() const noexcept; _Args = {std::reference_wrapper<A>&}]': 
/usr/local/include/c++/6.3.0/functional:603:27: required by substitution of 'template<class ... _Args> decltype (std::__invoke(((const std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>*)this)->std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::_M_pmf, (forward<_Args>)(std::_Mem_fn_base::operator()::__args)...)) std::_Mem_fn_base<_MemFunPtr, __is_mem_fn>::operator()(_Args&& ...) const [with _Args = {std::reference_wrapper<A>&}]' 
/usr/local/include/c++/6.3.0/functional:1027:64: required from here 
/usr/local/include/c++/6.3.0/functional:245:5: error: no type named 'type' in 'class std::result_of<A& (std::reference_wrapper<A>::* const&(std::reference_wrapper<A>&))() const noexcept>' 
+0

사람들이 귀하의 질문에 답변 할 수 있도록 돕기 위해 오류에 대해 구체적으로 설명해야합니다. 게시물을 [편집]하여 [mcve]에서 얻은 정확한 오류를 통합하십시오 (가능한 경우 복사 + 붙여 넣기를 사용하여 오류를 피하십시오). –

+0

아마도 컴파일러 오류가 도움이되지 않을 수도 있지만 도움이 될 수 있습니다. 잘 컴파일 –

+0

, GCC 4.8, 리눅스은 0x7ffed79d12bf 0x7ffed79d12bf 0x7ffed79d12bf 0x7ffed79d12bf –

답변

5

표준 라이브러리의 멤버 함수의 주소를 가지고하는 것은 불법이다, implementations can add overloads and mutilate their signatures at will 때문이다. 따라서 표준 라이브러리, 특히 the INVOKE protocol used by bind and friendsstd::reference_wrapper의 멤버에 대한 포인터가 전달되지 않는다는 가정하에 설계되었습니다. reference_wrapperr과 함께 구성원 pm에 대한 포인터를 호출하는 것은 pmr.get()으로 호출하는 것과 동일합니다. 즉, 기준은 무조건적으로 언 래핑된다.

도 참조하십시오. reference_wrapper 처리를 INVOKE에 추가 한 LWG issue 2219도 참조하십시오.

+0

이것이 컴파일을 잘못한 것입니까? 아니면 그냥 정의되지 않은 동작입니까? – atb

+2

@atb 정의되지 않은 동작입니다. –