使用模块和反射
我正在尝试在C++模块中使用反射。当我 #include <meta> 时,一切都能编译通过并正常工作。改用 import std; 则会导致编译错误。
import std; 确实可用,只要我不使用std.meta中的任何内容。
使用 readelf 时,我在来自std.meta命名空间的std.gcm中看不到任何符号。
这是gcc 16.1.1的问题吗,还是我的代码有问题?
代码:
import std;
int main() {
constexpr auto ns_refl = ^^std;
constexpr auto ctx = std::meta::access_context::unchecked();
constexpr auto members =
std::define_static_array(std::meta::members_of(ns_refl, ctx));
template for (constexpr auto &member : auto(members)) {
if constexpr (std::meta::has_identifier(member))
std::cout << std::meta::identifier_of(member) << '\n';
}
}
编译器选项:
-std=c++26 -O3 -flto
错误:
: In function ‘int main()’:
:5:35: error: ‘std::meta::access_context’ has not been declared
5 | constexpr auto ctx = std::meta::access_context::unchecked();
| ^~~~~~~~~~~~~~
:7:12: error: ‘define_static_array’ is not a member of ‘std’
7 | std::define_static_array(std::meta::members_of(ns_refl, ctx));
| ^~~~~~~~~~~~~~~~~~~
:7:43: error: ‘members_of’ is not a member of ‘std::meta’
7 | std::define_static_array(std::meta::members_of(ns_refl, ctx));
| ^~~~~~~~~~
:9:30: error: ‘has_identifier’ is not a member of ‘std::meta’
9 | if constexpr (std::meta::has_identifier(member))
| ^~~~~~~~~~~~~~
:10:31: error: ‘identifier_of’ is not a member of ‘std::meta’
10 | std::cout << std::meta::identifier_of(member) << '\n';
| ^~~~~~~~~~~~~
一个最小的可编译(或因我看到的错误而失败)的示例可以在这里找到:https://godbolt.org/z/eKhz49z8K
解决方案
移除 target_compile_options(the_executable PRIVATE -freflection),并在 project(shapes) 调用之后立即添加 set(CMAKE_CXX_FLAGS "-freflection ${CMAKE_CXX_FLAGS}") 即可修复。
这个修复在命令行的开头添加 -freflection 标志。我怀疑这可能是GCC的一个排序相关的错误,但我尚未调查它是否确实如此。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。