【发布时间】:2016-09-06 23:03:09
【问题描述】:
阅读this answer后,我做了一些测试,我想出了以下代码:
#include <iostream>
template <typename T>
class Test {
int val{42};
friend std::ostream & operator << (std::ostream & flux, Test const & instance) {
return flux << Test<char>{}.val;
}
};
int main() {
std::cout << Test<int>{};
return 0;
}
在main() 中使用Test<int>,我认为operator<< 无法访问Test<char>{}.val。但令我惊讶的是,GCC 编译得很好。
然后,我使用 Clang 和 Visual Studio 进行了测试,两者都给了我一个私有成员错误,正如预期的那样(请参阅 GCC/Clang demo)。
哪个编译器是正确的?
另外,我想知道在哪种情况下需要链接中提到的 extrovert 版本?或者从Test<T> 的operator<< 内部对Test<U> 的私人访问(当T != U 时)?你有什么实际的例子吗?
【问题讨论】:
-
您询问的是哪个版本的 C++?您使用了哪些编译器版本?
-
我在标准 (C++11) 中没有看到任何证据表明该程序应该被认为是有效的,但 GCC 接受似乎如此明显的错误令人怀疑。
-
也许有人误读了 14.5.4/5... 11.3/2 很清楚,没有什么与我发现的矛盾之处。我建议您将其发布在 GCC 的 Bugzilla 上,然后用一个答案向我们报告开发人员得出的任何结论。
标签: c++ templates operator-overloading friend ostream