繁体   English   中英

如何使重载的 function 成为从属名称,以便两阶段查找找到它?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM