似乎clang-4.0.0的Non-type template parameters with auto type (P0127R2)实施中存在错误。这是问题所在:
// file main.cpp
template < int, typename RR > void f1(RR&&) { }
template < auto, typename RR > void f2(RR&&) { }
class Class
{
template < int, typename RR > friend void f1(RR&&);
template < auto, typename RR > friend void f2(RR&&);
};
template < typename >
class ClassT
{
template < int, typename RR > friend void f1(RR&&);
template < auto, typename RR > friend void f2(RR&&);
};
int main()
{
f1<0>(0);
f1<0>(Class{});
f1<0>(ClassT<int>{});
f2<0>(0);
f2<0>(Class{});
f2<0>(ClassT<int>{}); // FAILS ?!
return 0;
}
最后一行失败,error: call to 'f2' is ambiguous
指向f2
的定义作为一种替代方案,并且f2
的朋友声明?! ClassT
作为第二种选择。像这样:
main.cpp:26:5: error: call to 'f2' is ambiguous
f2<0>(ClassT<int>{}); // FAILS ?!
^~~~~
main.cpp:4:37: note: candidate function [with $0 = 0, RR = ClassT<int>]
template < auto, typename RR > void f2(RR&& ) { }
^
main.cpp:16:48: note: candidate function [with $0 = 0, RR = ClassT<int>]
template < auto, typename RR > friend void f2(RR&&);
^
1 error generated.
这真是一个错误还是我弄错了?
我正在使用clang++ -std=c++1z main.cpp
进行编译,其中clang++ --version
给出了
clang version 4.0.0 (trunk 284635) (llvm/trunk 284639)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/bin