ADL在constexpr函数中不起作用(仅适用于clang)

Dr.*_*Gut 7 c++ templates clang argument-dependent-lookup constexpr

以下代码使用MSVC和gcc进行编译,但不能使用clang进行编译。为什么?

如果CallFoo ()is的话,似乎ADL无法正常工作constexpr。查看评论。

template <class T>
constexpr void CallFoo  ()          // Remove constexpr to fix clang compilation error.
{
    Foo (T ());
}


class Apple {};


int main ()
{
    CallFoo<Apple> ();
}


constexpr void Foo (Apple)
{
}
Run Code Online (Sandbox Code Playgroud)

Clang错误消息(请参阅godbolt.org):

<source>:4:5: error: use of undeclared identifier 'Foo'
    Foo (T ());
    ^
<source>:13:5: note: in instantiation of function template specialization 'CallFoo<Apple>' requested here
    CallFoo<Apple> ();
    ^
Run Code Online (Sandbox Code Playgroud)

Jar*_*d42 1

声明应该在实例化时可见,因此 clang 有权拒绝您的代码。重新排序函数修复编译:

constexpr void Foo (Apple)
{
}

int main ()
{
    CallFoo<Apple> ();
}
Run Code Online (Sandbox Code Playgroud)

演示

事实上,文件末尾也是实例化点,gcc/MSVC 应该只考虑这一点:/