C++:将成员容器的迭代器接口转发到类接口



我正在处理一个具有std::array<double, 2>数据成员的类,我正试图通过简单地将所有内容传递到std::array上来为我的类实现一些基本的迭代器机制(begin()end()现在就足够了)。

我使用decltypestd::declval来推断std::arraybegin()的返回类型。

class myCont {
public:
myCont() : data({{-1, 1}}) {}
/* Pass to iterator mechanism of std::array */
auto begin() -> decltype(declval<array<double, 2>>().begin()){return data.begin();}
auto cbegin() -> decltype(declval<array<double, 2>>().cbegin()){return data.cbegin();}
auto end() -> decltype(declval<array<double, 2>>().end()){return data.end();}
auto cend() -> decltype(declval<array<double, 2>>().cend()){return data.cend();}
private:
array<double, 2> data;
};

使用myCont作为const-ref参数会产生有关const正确性的错误:将'const-myCont'作为'this'参数传递会丢弃限定符

void myContainerFunc(const myCont& c){
for(auto it = c.cbegin(); it != c.cend(); it++) // Error
cout << *it << ' ' << endl;
}   

而采用CCD_ 10的完全相同的函数工作得很好。

void myContainerFunc(const myCont& c){
for(auto it = c.cbegin(); it != c.cend(); it++) // works perfectly fine
cout << *it << ' ' << endl;
}   

为什么myCont::begin()等的行为不像std::array的实现,它们应该调用这些实现?有人能指出我的错误吗?decltype是否抛弃了惊愕或类似的东西?

谢谢。

您的方法cbegin()cend()应该是常量限定的:

auto cbegin() const -> decltype(declval<array<double, 2>>().cbegin()) {return data.cbegin();}

如果您检查std::array,您会注意到相应的方法是const限定的。

最新更新