【发布时间】:2017-10-26 10:22:09
【问题描述】:
考虑以下代码:
#include <iostream>
struct foo {
friend void bar(foo) {}
void foobar() {
std::cout << &bar << '\n'; // error
}
};
int main() {
bar(foo{}); // ok, visible through ADL
foo{}.foobar();
}
gcc 给我这个错误:
main.cpp: In member function 'void foo::foobar()': main.cpp:7:23: error: 'bar' was not declared in this scope std::cout << &bar << '\n'; // error ^~~
这是因为bar 是类本身定义的友元函数,使其在全局命名空间中不可见。访问它的唯一方法是通过ADL,但是我没有找到使用ADL获取bar的地址的方法。
所以我的问题是,我如何获取bar 的地址?除了在foo 之外定义bar,还有其他方法吗?
【问题讨论】:
-
由于 ADL 仅适用于函数调用,因此您的问题归结为“如何从函数调用表达式中检索函数的地址”。我怀疑有办法,但欢迎惊喜。
-
为什么?由于该函数被声明为内联,因此很可能在任何使用它的地方都被内联。因此它没有唯一的地址。这里的外部问题是什么?
-
@EJP “问题”是我有几个运算符,每个运算符都执行相同的步骤,除了一个特定的朋友函数。我的目标是调用这个通用函数,而不是一遍又一遍地编写相同的步骤。但是我需要将这些朋友函数作为参数传递,因此提出了这个问题。
标签: c++