You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何pybind中无参构造函数使用py::kw_only会报错?

问题与解决:pybind11重载构造函数使用py::kw_only触发静态断言错误

问题描述

在C++中定义了包含默认构造函数和带参构造函数的重载构造函数,自动生成的pybind11绑定代码如下:

py::class_<MyClass>(m, "MyClass")
    .def(
        py::init<>(),
        py::kw_only()
    )
    .def(
        py::init<std::valarray<std::string>>(),
        py::kw_only(),
        py::arg("my_var")
    )

保留无参构造函数时触发如下编译错误:

error: static assertion failed: py::kw_only requires the use of argument annotations
static_assert(has_arg_annotations || !has_kw_only_args, 
"py::kw_only requires the use of argument annotations"

删除无参构造函数则编译正常,请问错误原因及解决方法?(使用自定义pybind生成器)

错误原因

py::kw_only()的作用是强制后续的函数/构造函数参数必须通过关键字参数传递,但无参构造函数没有任何参数可以绑定到关键字。pybind11的静态断言会检查:如果使用了py::kw_only(),则必须同时存在参数注解(即py::arg()这类标记),而无参构造函数无法提供任何参数注解,因此触发断言失败。

解决方法

方法1:移除无参构造函数的py::kw_only()

无参构造函数本身不需要任何参数,完全不需要强制关键字传递,直接去掉py::kw_only()即可:

py::class_<MyClass>(m, "MyClass")
    .def(py::init<>())  // 移除py::kw_only()
    .def(
        py::init<std::valarray<std::string>>(),
        py::kw_only(),
        py::arg("my_var")
    )

方法2:(可选)为无参构造函数添加空的参数注解

如果自定义生成器必须保留py::kw_only(),可以添加一个空的参数注解来满足断言条件,但这种做法没有实际业务意义,仅为了通过编译:

py::class_<MyClass>(m, "MyClass")
    .def(
        py::init<>(),
        py::kw_only(),
        py::arg()  // 空参数注解,仅满足断言要求
    )
    .def(
        py::init<std::valarray<std::string>>(),
        py::kw_only(),
        py::arg("my_var")
    )

内容的提问来源于stack exchange,提问作者thzu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:15:35