Ошибка при применении std :: bind к функции с аргументом? - PullRequest
0 голосов
/ 20 мая 2018

Есть функция, принимающая аргумент с типом boost::asio::ip::tcp::socket.Но я не смог применить std :: bind к нему.Я проверил аргументы шаблона в std :: _ Bind_helper, но проблем не найдено.Я пробовал и gcc 8.1.0, и clang 6.0.0, и они выдают одну и ту же ошибку.

#include <functional>
#include <boost/asio.hpp>
using namespace std;
namespace asio = boost::asio;
using tcp = asio::ip::tcp;

int c;

void good_f(int) {c=1;}
void good() {
    using typeA = int;

    auto helper = std::bind(&good_f, typeA(1));
    helper();
    // OK
}

void fixed_f(tcp::socket &) {c=1;}
void fixed() {
    using type1 = tcp::socket;
    asio::io_context ioc;
    tcp::socket sock(ioc);

    auto helper = std::bind(&fixed_f, std::ref(sock));
    helper();
    // OK
}

void fail_f(tcp::socket &&) {c=1;}
void fail() {
    using type1 = tcp::socket;
    asio::io_context ioc;
    tcp::socket sock(ioc);

    // fail_f(std::move(sock));
    // OK

    auto helper = std::bind(&fail_f, std::move(sock));
    helper();
    // a.cc:34:5: error: no matching function for call to object of type 'std::_Bind<void (*(boost::asio::basic_stream_socket<boost::asio::ip::tcp>))(boost::asio::basic_stream_socket<boost::asio::ip::tcp> &&)>'
    //    helper();
    //    ^~~~~~
}

Журнал компиляции и ошибки:

recolic@RECOLICPC ~/tmp> clang++ --version
clang version 6.0.0 (tags/RELEASE_600/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
recolic@RECOLICPC ~/tmp> clang++ -c a.cc
a.cc:39:5: error: no matching function for call to object of type 'std::_Bind<void (*(boost::asio::basic_stream_socket<boost::asio::ip::tcp>))(boost::asio::basic_stream_socket<boost::asio::ip::tcp> &&)>'
    helper();
    ^~~~~~
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.0/../../../../include/c++/8.1.0/functional:480:2: note: candidate template ignored: substitution failure [with _Args = <>]: no type named 'type' in 'std::result_of<void
      (*&(boost::asio::basic_stream_socket<boost::asio::ip::tcp> &))(boost::asio::basic_stream_socket<boost::asio::ip::tcp> &&)>'
        operator()(_Args&&... __args)
        ^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.0/../../../../include/c++/8.1.0/functional:491:2: note: candidate template ignored: substitution failure [with _Args = <>]: no type named 'type' in 'std::result_of<void (*const &(const
      boost::asio::basic_stream_socket<boost::asio::ip::tcp> &))(boost::asio::basic_stream_socket<boost::asio::ip::tcp> &&)>'
        operator()(_Args&&... __args) const
        ^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.0/../../../../include/c++/8.1.0/functional:509:2: note: candidate template ignored: substitution failure [with _Args = <>]: no type named 'type' in 'std::result_of<void (*volatile &(volatile
      boost::asio::basic_stream_socket<boost::asio::ip::tcp> &))(boost::asio::basic_stream_socket<boost::asio::ip::tcp> &&)>'
        operator()(_Args&&... __args) volatile
        ^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/8.1.0/../../../../include/c++/8.1.0/functional:521:2: note: candidate template ignored: substitution failure [with _Args = <>]: no type named 'type' in 'std::result_of<void (*const volatile &(const volatile
      boost::asio::basic_stream_socket<boost::asio::ip::tcp> &))(boost::asio::basic_stream_socket<boost::asio::ip::tcp> &&)>'
        operator()(_Args&&... __args) const volatile
        ^
1 error generated.

Я не уверенчто вызвало эту ошибку.Не могли бы вы дать мне какие-либо предложения?

1 Ответ

0 голосов
/ 22 мая 2018

void fail_f_1(tcp::socket); std::bind(&fail_f_1, tcp::socket(io_context)); Это решение завершается ошибкой, поскольку boost::asio::ip::tcp::socket невозможно скопировать.

void fail_f_2(tcp::socket &&); std::bind(&fail_f_2, std::move(tcp::socket(io_context))); Это решение не выполняется, поскольку std::bind передает связанные аргументы как lvalues, а не rvalue.fixed_f является хорошим решением.

Если вам нужно передать rvalue-reference в качестве связанного аргумента, этот ответ поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...