【发布时间】:2018-10-26 00:36:33
【问题描述】:
给定一个容器,例如 vector<int>
#include <vector>
using namespace std;
vector<int> v{1, 2, 3};
为什么访问iterator 和const_iterator 等公共类型成员似乎相当困难?据我了解,这些名称是类的一部分(不是对象),必须通过:: 访问以指定范围,但是当v 已知时,是否有理由禁止v.const_iterator?
示例:
int f(v.iterator it) {
return *it;
}
// or
int g(v::iterator it) {
return *it;
}
一种解决方法是使用decltype,如:
int h(decltype(v)::iterator it) {
return *it;
}
但是这种方法甚至在类中也不起作用,因为以下失败:
class A
{
public:
int h(decltype(x)::iterator it) {
return *it;
}
private:
vector<int> x;
};
编辑
只是一点旁注。
正如所指出的,v.iterator 的含义将取决于使用点(编译时)忽略运行时多态性的v 的类型。但对于静态类成员也是如此。
示例:
struct A
{
static const int x = 1;
};
struct B : public A
{
static const int x = 2;
};
void eval()
{
B b;
A& ar = b;
b.x; // 2
ar.x; // 1, even though ar refers to the same underlying object (by the base type)
}
【问题讨论】:
-
类型和对象存在是 C++ 中的平行宇宙(一个主要是编译时,其他主要是运行时。)点应用于对象,因此应该在运行时工作,因此不是对于类型。作为旁注,您可以在此处使用
auto来节省一些输入。 -
@FrançoisAndrieux 对不起,我的意思是最后一个例子
-
auto在A::h的函数参数中如何工作?对我来说,它不能用 c++17 编译。 -
decltype()不是一种解决方法,而是一种解决方法,它适用于类,您只需要在使用之前定义该变量。 -
return *it + *(++it);UB 的好例子 :)
标签: c++