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)
声明应该在实例化时可见,因此 clang 有权拒绝您的代码。重新排序函数修复编译:
constexpr void Foo (Apple)
{
}
int main ()
{
CallFoo<Apple> ();
}
Run Code Online (Sandbox Code Playgroud)
事实上,文件末尾也是实例化点,gcc/MSVC 应该只考虑这一点:/
| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |