C ++ 17 std :: shared_ptr<>对类数组对象

时间:2018-01-21 16:48:47

标签: c++ arrays overloading shared-ptr c++17

我有一个包含数组的基类,并提供一个简单的运算符[]:

class Object
{
public:
    std::shared_ptr<Object> operator[](const int index);

    [...]

private:
    std::vector<std::shared_ptr<Object>> internal_array;
};

当我想直接访问operator [](因为C ++ 17)而没有取消引用时,我的编译器(MSVC 2017)不喜欢这样:

std::shared_ptr<Object> one_object;
std::shared_ptr<Object> another_object = one_object[0];

如果允许数组类型(比如std :: vector)进行直接索引数组访问,那么为什么一个带有operator []的类不是?

1 个答案:

答案 0 :(得分:4)

C ++ 17 shared_ptr<T>::operator[]仅适用于数组类型,std :: vector 数组类型(例如int[]int[3]等等。)。也就是说,相关的标准文件是:

  

[util.smartptr.shared.obs] element_type&amp; operator [](ptrdiff_t i)const [...] 备注:当T不是数组类型时,未指定是否声明了此成员函数。如果它被声明,则未指定它的返回类型是什么,除了函数的声明(尽管不一定是定义)应该很好地形成。

这意味着即使对于非数组类型,实现也可以提供成员下标运算符,唯一的要求是它的声明形成良好(这是为了SFINAE友好);它的定义可能是也可能不是格式良好,可能会也可能不会做出正确的定义。的事情。