将此主题视为以下主题的续集:
上一期文章
未定义行为和顺序点
让我们重新看一下这个有趣而令人费解的表达(斜体字词来自上面的主题* smile *):
i += ++i;
我们说这会调用未定义的行为。我相信,当这样说,我们隐含假设型的i
是内置的类型之一。
如果什么类型的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
不是一开始的表达方式吗?如果是这样,那么它是什么,expression的定义是什么?
如果它是一个表达式,并且其行为也得到了很好的定义,则意味着与该表达式关联的序列点数在某种程度上取决于该表达式所涉及的操作数的类型。我是否正确(甚至部分正确)?
顺便说一下,这个表情怎么样?
//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;
}
};