使用模块和反射

编程语言 2026-07-09

我正在尝试在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的一个排序相关的错误,但我尚未调查它是否确实如此。

godbolt.org/z/zzKvEs8G9

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章