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

C++ 类内定义的友元函数的调试标志中的命名空间,c++,argument-dependent-lookup,friend-function,C++,Argument Dependent Lookup,Friend Function,我正在处理一个类,它在类中定义了一个友元函数,而没有外部声明 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 vali

我正在处理一个类,它在类中定义了一个友元函数,而没有外部声明

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
然而,我注意到
set\u union
似乎位于
our\u名称空间
名称空间中

        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
关于如何理解调试信息的任何提示


<>编辑:<代码> SETIONION/OSCOD>函数体只是一个有效的定义的例子。

< P> C++标准只定义了编译行为,与程序的编译和行为有关。它没有定义代码生成的所有方面,特别是没有定义调试符号


因此,您的编译器正确地(按照标准)不允许通过不在其中的命名空间调用该函数。但是,由于函数确实存在,并且您应该能够调试它,所以它需要将调试符号放在某个地方。封闭名称空间似乎是一个合理的选择。

Hm,由触发,我查看了中间编译器步骤,这看起来像
set\u union
our\u名称空间中。我搞糊涂了。@pseyfert不要把实现细节和形式语言规则混为一谈。这些规则使得名称无法在名称空间中找到(仅通过ADL查找),因此从代码的角度来看,无论出于何种目的,它都不在名称空间中。尽管名称存在,但编译器需要生成符号和所有内容,并且它将符号放在命名空间中,以获得代码生成透视图。
        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
auto foo(std::vector<our_namespace::our_container<float>> in) {
  // fails:
  return our_namespace::set_union(in[0], in[1]);
}