我正在处理一个具有std::array<double, 2>
数据成员的类,我正试图通过简单地将所有内容传递到std::array
上来为我的类实现一些基本的迭代器机制(begin()
和end()
现在就足够了)。
我使用decltype
和std::declval
来推断std::array
的begin()
的返回类型。
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限定的。