Почему нельзя использовать std::ref для передачи объектов в модули Boost.Python?

Среда: Boost 1.61.0, скомпилированная с Python 3.5

Следующие выводы кода C++ 12:

class A
{
public:
    int func() { return 12; }
};

BOOST_PYTHON_MODULE(bridge)
{
    using namespace boost::python;
    class_<A>("A", no_init)
        .def("func", &A::func);
}

int main()
{
    A a;
    PyImport_AppendInittab("bridge", PyInit_bridge);
    Py_Initialize();
    using namespace boost::python;

    dict dictMain = extract<dict>(import("__main__").attr("__dict__"));

    import("bridge").attr("a") = boost::ref(a);
    exec("import bridge", dictMain);
    exec("print(bridge.a.func())", dictMain);
}

Однако, если я заменю boost::ref с std::ref, boost::python::error_already_set экземпляр брошен.

Почему не можешь std::ref использоваться здесь?

1 ответ

Решение

Хорошая статья об обработке исключений Python в C++. В любом случае, я думаю, Python за исключением AttributeError из-за разницы в reference_wrapper реализации в std и boost библиотеки. Вы можете увидеть разницу даже в общедоступном интерфейсе. std::reference_wrapper не имеет get_pointer() метод.

Другие вопросы по тегам