朋友运营商<<和模板类成员的私有访问

时间:2016-09-06 23:03:10

标签: c++ templates operator-overloading friend ostream

在阅读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 }) } 时)?你有任何实际的例子吗?

1 个答案:

答案 0 :(得分:0)

我相信Clang / VS正在使用正确的行为,因为如果您创建一个新实例(如您的示例中)而不是使用参数中的friended实例,我相信它会将访问重置为从外部进行。

至于额外的问题,我想不出一个外向的实际例子,但我想它就像C ++中的许多东西一样,让你按照这种方式去做。也许用它来从一种类型转换为另一种类型?不确定,抱歉^^;

对不起原来的混淆。