C++17 std::shared_ptr<> 为类数组对象重载 operator[]
C++17 std::shared_ptr<> overload operator[] for array-like objects
我有一个基础 class,它包含数组并提供一个简单的运算符[] :
class Object
{
public:
std::shared_ptr<Object> operator[](const int index);
[...]
private:
std::vector<std::shared_ptr<Object>> internal_array;
};
当我想在不取消引用的情况下直接访问运算符[](C++17 起)时,我的编译器 (MSVC 2017) 不喜欢那样:
std::shared_ptr<Object> one_object;
std::shared_ptr<Object> another_object = one_object[0];
如果数组类型(比如 std::vector)允许直接索引数组访问,为什么 class with operator[] 不允许?
C++17 shared_ptr<T>::operator[]
仅适用于数组类型,std::vector 不是 数组类型(例如,int[]
,int[3]
,等等..是)。也就是说,相关的标准文档如下:
[util.smartptr.shared.obs] element_type& operator[](ptrdiff_t i) const[...]Remarks: When T is not an array type, it is unspecified whether this member function is declared. If it is declared, it is unspecified what its return type is, except that the declaration (although not necessarily the definition) of the function shall be well formed.
这意味着即使对于非数组类型,实现也可以提供成员下标运算符,唯一的要求是其声明格式正确(这是为了 SFINAE 友好);它的定义可能格式正确,也可能不正确,并且可能会或可能不会做 'right' 事情。
我有一个基础 class,它包含数组并提供一个简单的运算符[] :
class Object
{
public:
std::shared_ptr<Object> operator[](const int index);
[...]
private:
std::vector<std::shared_ptr<Object>> internal_array;
};
当我想在不取消引用的情况下直接访问运算符[](C++17 起)时,我的编译器 (MSVC 2017) 不喜欢那样:
std::shared_ptr<Object> one_object;
std::shared_ptr<Object> another_object = one_object[0];
如果数组类型(比如 std::vector)允许直接索引数组访问,为什么 class with operator[] 不允许?
C++17 shared_ptr<T>::operator[]
仅适用于数组类型,std::vector 不是 数组类型(例如,int[]
,int[3]
,等等..是)。也就是说,相关的标准文档如下:
[util.smartptr.shared.obs] element_type& operator[](ptrdiff_t i) const[...]Remarks: When T is not an array type, it is unspecified whether this member function is declared. If it is declared, it is unspecified what its return type is, except that the declaration (although not necessarily the definition) of the function shall be well formed.
这意味着即使对于非数组类型,实现也可以提供成员下标运算符,唯一的要求是其声明格式正确(这是为了 SFINAE 友好);它的定义可能格式正确,也可能不正确,并且可能会或可能不会做 'right' 事情。