gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:25:53 24 4
gpt4 key购买 nike

我正在处理一个在类中定义友元函数而无需外部声明的类

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

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

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

但是我注意到 in the debug flags 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

尽管我不能将其称为our_namespace::set_union

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

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

编辑:set_union 函数体在这里只是一个具有有效定义的稻草狗示例。

最佳答案

C++ 标准仅定义了与代码编译和生成程序的行为有关的编译器行为。它没有定义代码生成的所有方面,尤其是没有定义调试符号。

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

关于c++ - 类内定义的友元函数的调试标志中的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54577942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com