iter++->empty() 是一个合法的表达式吗?
Is iter++->empty() a legal expression?
iter++->empty()
是合法表达吗?
iter
是string
s的vector
的iterator
。
我问是因为考虑到运算符的优先级,->
和()
都应该在后缀增量之前,但我真的不知道操作数应该如何分组。
在我的编译器上它可以工作(表达式产生第一个字符串的empty()
结果,iter
指向第二个字符串),但我仍然想知道它是否是未定义的行为。
编辑
我刚刚找到了解决方案(我认为):
iter++->empty()
应与(*iter++).empty()
相同
因此,考虑到结合性和优先规则,分组应为:
(((*(iter++)).empty) ())
这是对的吗?
这是合法的,但不要这样做。
问自己这个问题足以将其分为两句话:
iter->empty();
iter++;
假设迭代器it
有效,表达式it++->empty()
是明确定义的
假设iter->empty()
是一个有效的陈述,答案是肯定的。后递增运算符不会改变iter
的类型,只是在执行empty()
方法后递增它。
但是,我建议将其拆分为两个语句,因为(尤其是后)增量语句通常会使您的代码不太清晰。那么为什么不去:
iter->empty();
iter++;
相关文章:
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 编写了一个C++代码来检查表达式是否具有平衡括号并且我的代码未运行.我已经卡了一天了
- void() 是一个有效的C++表达式吗?
- 如何在一个表达式中生成并返回结果?
- 编译器错误:函数调用在常量表达式中必须有一个常量值
- 如何将正则表达式向量与一个字符串匹配?
- 为什么一个表达式中的 std::string 连接给出的结果与逐个字符不同的结果?
- 一次包含一个 #include 表达式的多个头文件?
- 在另一个成员函数中调用成员函数时'int'之前的预期主表达式
- 使用折叠表达式构造一个平凡的对象
- 是否有一个上下文表达式`a.b :: c`有意义
- 使用参数包和元组创建一个简单的表达式类
- 可以将算术表达式作为参数传递给一个函数来描述其中的逻辑
- CUDA C++:文件中 kernel.cu 应有一个表达式
- 如果我将 decltype 应用于产生右值的表达式,我是否总是得到一个指针?C++
- 将一个特定字符替换为正则表达式匹配中的另一个字符
- 如何为字符串编写正则表达式,其中包含一个数字至少一个数字,并且不包含任何字母
- constexpr 表达式和变量生存期,G++ 和 Clang 不同意的一个例子