C++ 为什么不是';t标准::可选<;T>;::value()是自由函数吗?

C++ 为什么不是';t标准::可选<;T>;::value()是自由函数吗?,c++,c++17,std,optional,member-functions,C++,C++17,Std,Optional,Member Functions,据我所知,建议尽可能使用非友元非成员函数,因为它将处理类的算法与其私有字段分离。使用此逻辑,我们可能会实现如下内容的std::optional::value() template<typename T> T& value(std::optional<T>& optional) { if (optional.has_value()) { return *optional; } else { throw std::bad_optiona

据我所知,建议尽可能使用非友元非成员函数,因为它将处理类的算法与其私有字段分离。使用此逻辑,我们可能会实现如下内容的
std::optional::value()

template<typename T> T& value(std::optional<T>& optional) {
  if (optional.has_value()) {
    return *optional;
  } else {
    throw std::bad_optional_access("empty optional");
  }
}
模板T和值(标准::可选和可选){
if(可选。具有_值()){
返回*可选;
}否则{
抛出std::错误的可选访问(“空可选”);
}
}

但是,
value()
是一个成员函数。为什么?同样的问题也可以应用于
std::optional::value\u或()

也建议封装和提供语义上合理的API。你想要什么
optional.value()
std::value\u of_optional(optional)
如果是这种情况,我们可以基于
std::vector::size()
实现
std::vector::empty
实现
。然而,
cbegin()
crend()
等可能是广义自由函数,不是吗?@它们已经是自由函数了。自由函数只是(据我所知)被使用,因为我们希望它们与不能有成员函数的数组一起工作。对于类类型,自由函数只是用相同的名称调用成员函数。@eerorika。实际上,我甚至不认为有什么理由让成员
c
-版本的
begin()
end()
。是否有?还建议封装和提供语义上合理的API。你想要什么
optional.value()
std::value\u of_optional(optional)
如果是这种情况,我们可以基于
std::vector::size()
实现
std::vector::empty
实现
。然而,
cbegin()
crend()
等可能是广义自由函数,不是吗?@它们已经是自由函数了。自由函数只是(据我所知)被使用,因为我们希望它们与不能有成员函数的数组一起工作。对于类类型,自由函数只是用相同的名称调用成员函数。@eerorika。实际上,我甚至不认为有什么理由让成员
c
-版本的
begin()
end()
。有吗?