我注意到以下场景中Clang的一些独特行为:
有一个类 foo ,它包含一个私有成员函数模板 function_template 。 foo还将非嵌套struct bar 声明为friend:
struct bar;
class foo {
friend struct ::bar;
template<typename T> void function_template() {}
};
在栏内部,声明了成员别名模板 type ,它引用了foo&#39; s成员函数模板的返回类型,如下所示:
struct bar {
template<typename T> using type = decltype(foo().function_template<T>());
}
使用clang,编译器无法为任何模板参数实例化公共别名模板bar :: type:
#include <typeinfo>
#include <iostream>
int main {
std::cout << typeid(bar::type<int>).name() << std::endl;
// error : 'function_template' is a private member of 'foo'
}
此行为符合标准吗? MSVC和GCC都执行此实例化。 Clang还执行其他别名模板的实例化,这些模板引用了朋友类的私有成员。
我可以在此处找到对别名模板行为的扩展测试: https://ideone.com/cdB5lZ