【发布时间】:2017-11-17 11:44:23
【问题描述】:
我正在处理一个具有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;
}
虽然采用 std::array 的完全相同的函数可以正常工作。
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 会抛弃 constness 或类似的东西吗?
谢谢。
【问题讨论】:
-
您忘记将
const添加到cbegin和cend声明中。 -
确实,谢谢。
-
此外,容器通常同时具有
iterator begin();和const_iterator begin() const;,因此当容器被常量访问时,普通的begin会做“正确的事情”。end也一样。
标签: c++ iterator constants decltype