在阅读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;
}
在Test<int>
中使用main()
,我认为operator<<
无法访问Test<char>{}.val
。但令我惊讶的是,海湾合作委员会编制得很好。
然后,我使用Clang和Visual Studio进行了测试,并且两者都给出了一个私有成员错误,如预期的那样(参见GCC/Clang demo)。
哪种编译器是对的?
另外,我想知道在哪种情况下需要链接中提到的 extrovert 版本?或者Test<U>
operator<<
Test<T>
内的T
私人访问权限(U
!= getInitialState() {
return { style: styles.textinput_unfocused }
}
onFocus() {
this.setState({ style: styles.textinput_focused })
}
onBlur() {
this.setState({ style: styles.textinput_unfocused })
}
时)?你有任何实际的例子吗?
答案 0 :(得分:0)
我相信Clang / VS正在使用正确的行为,因为如果您创建一个新实例(如您的示例中)而不是使用参数中的friended实例,我相信它会将访问重置为从外部进行。
至于额外的问题,我想不出一个外向的实际例子,但我想它就像C ++中的许多东西一样,让你按照这种方式去做。也许用它来从一种类型转换为另一种类型?不确定,抱歉^^;
对不起原来的混淆。