cppyy cling声明=default构造函数时类成员初始化失败求助
cppyy指定C17标准却触发C20构造规则问题
问题描述
我通过以下命令安装cppyy:
STDCXX=17 MAKE_NPROCS=32 pip install --verbose cppyy --no-binary=cppyy-cling
在处理一个仅头文件库时遇到问题,该库同时声明了=default构造函数和成员初始化。示例代码如下:
import os os.environ["STDCXX"] = "17" os.environ["EXTRA_CLING_ARGS"] = "-std=c++17" import cppyy_backend.loader as l l.set_cling_compile_options(True) import cppyy cppyy.cppdef(""" class A { public: A() = default; // C++20中会报错,但C++17中合法 int a; }; int b() { A a{17}; return a.a; }; """) print(cppyy.gbl.b()) # 预期输出"17"
执行代码时出现如下错误:
note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int' to 'const A' for 1st argument class A ^ note: candidate constructor not viable: requires 0 arguments, but 1 was provided A() = default;
这种错误是C20的正确行为(C20中显式默认构造函数会抑制聚合初始化),但我已尝试强制使用C17标准。请问哪里还有遗漏?补充说明:root-config --cxx指向g 8.4.0。
解决方案
问题核心在于cppyy依赖的Cling解释器的标准版本识别逻辑:
- 安装时的
STDCXX=17仅影响cppyy自身编译,不控制运行时Cling解释代码的标准版本。 - 你设置的
EXTRA_CLING_ARGS和loader选项时机过晚,Cling初始化时未生效。
修正步骤
修改代码,在加载cppyy前就明确指定C++17标准,并通过Cling的pragma指令强制生效:
import os # 优先设置核心环境变量,确保Cling启动时加载C++17规则 os.environ["CPPYY_CXX_STANDARD"] = "17" os.environ["STDCXX"] = "17" os.environ["EXTRA_CLING_ARGS"] = "-std=c++17" # 先加载cppyy,避免loader设置滞后 import cppyy # 通过Cling指令强制确认标准版本 cppyy.gbl.gInterpreter.ProcessLine('#pragma cling std=c++17') cppyy.cppdef(""" class A { public: A() = default; int a; }; int b() { A a{17}; return a.a; }; """) print(cppyy.gbl.b()) # 此时会输出预期的17
额外排查点
如果上述修改仍无效:
- 检查Cling版本:部分新版本Cling默认启用C20特性,需确保cppyy-cling版本与g8.4.0兼容。
- 添加额外编译参数:在
EXTRA_CLING_ARGS中加入-fno-new-inheriting-ctors,强制禁用C++20中与构造函数相关的新特性。
内容的提问来源于stack exchange,提问作者Gleb Sternharz
相关产品推荐
相关产品推荐

