将此主题视为以下主题的续集:
上一部分
未定义的行为和序列点
让我们重温一下这个有趣而复杂的表达方式(斜体词组取自上述主题 *smile* ):
i += ++i;
我们说这调用了未定义的行为。我假设当这样说时,我们隐含地假设type ofi
是内置类型之一。
如果类型是i
用户定义的类型怎么办?说它的类型是Index
本文后面定义的类型(见下文)。它还会调用未定义的行为吗?
如果是,为什么?它不等同于写作i.operator+=(i.operator++());
甚至语法上更简单 i.add(i.inc());
吗?或者,他们是否也调用了未定义的行为?
如果没有,为什么不呢?毕竟,对象在连续序列点之间i
被修改了两次。请回忆一下经验法则:一个表达式只能在连续的“序列点”之间修改一个对象的值。如果 i += ++i
是一个表达式,那么它必须调用 undefined-behavior。如果是这样,那么它的等价物i.operator+=(i.operator++());
也 i.add(i.inc());
必须调用 undefined-behavior似乎是不真实的!(据我了解)
或者,i += ++i
不是一个表达式开始吗?如果是这样,那么它是什么,表达的定义是什么?
如果它是一个表达式,同时它的行为也是明确定义的,那么它意味着与表达式关联的序列点的数量在某种程度上取决于表达式中涉及的操作数的类型。我是否正确(甚至部分正确)?
顺便问一下,这个表情怎么样?
//Consider two cases:
//1. If a is an array of a built-in type
//2. If a is user-defined type which overloads the subscript operator!
a[++i] = i; //Taken from the previous topic. But here type of `i` is Index.
您也必须在回复中考虑到这一点(如果您确定知道它的行为)。:-)
是
++++++i;
在 C++03 中定义良好?毕竟是这个,
((i.operator++()).operator++()).operator++();
class Index
{
int state;
public:
Index(int s) : state(s) {}
Index& operator++()
{
state++;
return *this;
}
Index& operator+=(const Index & index)
{
state+= index.state;
return *this;
}
operator int()
{
return state;
}
Index & add(const Index & index)
{
state += index.state;
return *this;
}
Index & inc()
{
state++;
return *this;
}
};