类内定义的友元函数的调试标志中的命名空间

pse*_*ert 2 c++ friend-function argument-dependent-lookup

我正在处理一个类,该类在没有外部声明的情况下在类中定义了友元函数

namespace our_namespace {
template <typename T>
struct our_container {

  friend our_container set_union(our_container const &, our_container const &) {
    // meaningless for the example here, just a valid definition
    // no valid semantics
    return our_container{};
  }
};
}  // namespace our_namespace
Run Code Online (Sandbox Code Playgroud)

正如所讨论的(例如此处此处),函数set_union不在our_namespace命名空间中,但可以通过参数依赖查找找到:

auto foo(std::vector<our_namespace::our_container<float>> in) {
  // works:
  return set_union(in[0], in[1]);
}
Run Code Online (Sandbox Code Playgroud)

但是我注意到,调试标志中 set_union似乎是在our_namespace命名空间中

        mov     rdi, qword ptr [rbp - 40] # 8-byte Reload
        mov     rsi, rax
        call    our_namespace::set_union(our_namespace::our_container<float> const&, our_namespace::our_container<float> const&)
        add     rsp, 48
        pop     rbp
        ret
our_namespace::set_union(our_namespace::our_container<float> const&, our_namespace::our_container<float> const&): # @our_namespace::set_union(our_namespace::our_container<float> const&, our_namespace::our_container<float> const&)
        push    rbp
        mov     rbp, rsp
        mov     qword ptr [rbp - 16], rdi
        mov     qword ptr [rbp - 24], rsi
        pop     rbp
        ret
Run Code Online (Sandbox Code Playgroud)

虽然我不能称之为 our_namespace::set_union

auto foo(std::vector<our_namespace::our_container<float>> in) {
  // fails:
  return our_namespace::set_union(in[0], in[1]);
}
Run Code Online (Sandbox Code Playgroud)

有关如何理解调试信息的任何提示?

编辑:set_union函数体只是这里有一个有效定义的草案示例.

Ser*_*eyA 5

C++标准仅定义了关于代码编译和结果程序行为的编译器行为.它没有定义代码生成的所有方面,特别是它没有定义调试符号.

因此你的编译器正确(按照标准)不允许通过它不在的命名空间调用函数.但由于函数确实存在而你应该能够调试它,它需要将调试符号放在某处.封闭命名空间似乎是一个合理的选择.