[英]How to make an overloaded function a dependent name, so two-phase lookup finds it?
看这个例子:
template <typename TYPE>
struct Foo {
static constexpr auto a = bar(TYPE());
static constexpr auto b = static_cast<int (*)(TYPE)>(bar);
};
struct Bar {};
constexpr int bar(Bar) {
return 42;
}
int main() {
auto a = Foo<Bar>::a;
auto b = Foo<Bar>::b;
}
在Foo
的定义中,编译器不知道bar
。 但这在Foo::a
的初始化时不是问题,因为bar(TYPE())
是一个依赖表达式,所以 ADL 查找将在查找的第二阶段稍后找到bar
。 但这是Foo::b
初始化的问题,因为bar
不是依赖表达式,所以编译器抱怨bar
未声明( godbolt )。 所以我可以调用bar
( Foo::a
),但我不能获取它的地址 ( Foo::b
)。
有什么技巧可以让我得到bar
的地址(除了我在bar
之后移动Foo
的明显解决方案)? 例如,以某种方式创建一个依赖于TYPE
并返回bar
的地址的表达式?
不幸的是,你不能:即使bar
以某种方式依赖,ADL 也永远不会为它执行,因为它不是 function 被调用。 (换句话说,在依赖调用中不是 function 名称的非限定名称总是在模板定义中查找。)您可以做的最接近的事情是使用(并专门化!)一个特征并编写bar_trait<TYPE>::bar
或为bar
制作自己的包装器function 并获取其地址(这可能不够好,也可能不够好)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.