重新加载未定义的行为和序列点
将此主题视为以下主题的续篇:
让我们重新审视这个有趣而复杂的表达(斜体短语取自上述主题* smile *):
i += ++i;
我们说这会调用undefined-behavior。我假定说这个的时候,我们隐含假设型的i是内置的类型之一。
如果什么类型的i是用户定义类型?比如它的类型是Index在本文后面定义的(见下文)。它还会调用未定义的行为吗?
如果是,为什么?它不等同于写作i.operator+=(i.operator++());甚至语法上更简单i.add(i.inc());吗?或者,他们是否也调用未定义的行为?
如果不是,为什么不呢?毕竟,对象在连续的序列点之间i被修改两次。请回想一下经验法则:表达式只能在连续的“序列点”之间修改一个对象的值。如果 i += ++i是表达式,那么它必须调用未定义的行为。如果是,那么它的等价物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;
}};喵喵时光机
湖上湖
相关分类