3 回答
int *
和map::iterator
在这方面没有区别。int *
与and一起使用的周围语义构造有所不同map::iterator
,这就是为什么一个编译而另一个不编译的原因。
您if
可以选择
if (declaration)
或者
if (expression)
声明不是表达式。您不能将声明用作较大表达式中的子表达式。您不能将声明用作显式比较的一部分,这正是您尝试做的。
例如,如果你试图用 做同样的事情int *
,像这样
if ((int* x = new int(123)) != NULL)
map::iterator
代码无法编译的原因与您的代码无法编译的原因完全相同。
你必须使用
if (int* x = new int(123))
或者
int* x = new int(123);
if (x != NULL)
或者
int* x;
if ((x = new int(123)) != NULL)
正如您在上面看到的,int *
表现出与map::iterator
.
在您的示例中,不可能声明it
并执行与props.end()
in if
s 条件的比较。您将不得不使用上述变体之一,即
map<string, Property>::iterator it = props.find(PROP_NAME);
if (it != props.end())
或者
map<string, Property>::iterator it;
if ((it = props.find(PROP_NAME)) != props.end())
选择你更喜欢的。
PS当然,形式上也可以写
if (map<string, Property>::iterator it = props.find(PROP_NAME))
但它不会做你想做的事情(不将迭代器值与 进行比较props.end()
)并且可能根本无法编译,因为迭代器类型可能无法转换为bool
.
这是将其限制在范围内的一种方法:
{
auto it = props.find(PROP_NAME);
if (it != props.end()) {
it->do_something();
}
}
当然,这个范围在技术上不是“if 范围”,但应该同样适用于所有实际意图和目的。
正如AndreyT 已经解释过的(+1),声明不能超越(
and )
,你没有使用它,int
但你为迭代器做了。
映射迭代器包含first
和second
,它们分别指向键和值。要访问值的成员,请使用it->second.do_Something()