实例化引用私有函数模板的公共别名模板失败(clang)

时间:2017-04-26 20:43:31

标签: c++11 templates alias friend clang++

我注意到以下场景中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

0 个答案:

没有答案