可能是重复问题:
非静态成员函数的默认参数
如果我理解得不对,请纠正我,但我认为默认参数的工作方式如下:
当编译器看到函数调用时,它会开始将参数推入堆栈。当参数用完后,它会开始将默认参数推入堆栈,直到填满所有必需参数(我知道这是一种简化方式,因为实际上参数是从右到左推送的,所以它将从默认值开始,但思想是相同的)。
如果这是真的,为什么成员变量不能用作默认值呢?在我的看法中,由于编译器像往常一样在调用站点上推送它们,它应该能够很好地解析它们!
编辑 由于答案似乎误解了我的问题,让我澄清一下。我知道这是情况,并且我知道语言允许什么和不允许什么。我的问题是,既然它似乎自然而然地工作,为什么语言设计者选择不允许这样做。
&var
就没有问题了,因为&var
根本没有任何副作用。你甚至可以评估它两次(一次为a
,一次为b
),然后以任何顺序执行它。 - Baruchthis
的值,这与我的示例没有任何区别。 - AnT stands with Russia*this
只是指向用于实例化调用的实例的指针,因此它更像是调用bar(&c,&c + 4)
,这是完全合法的。编译器可以按任何顺序进行评估。第二个参数恰好取决于与第一个参数发送的相同值,而不是第一个参数本身。 - Baruchc
不是预先准备好的变量,而是函数调用的结果,例如obtain_c_from_somewhere().bar()
呢?两次调用该函数是不可接受的。在这种情况下,唯一的解决方案是始终确保首先调用obtain_c_from_somewhere()
(以获取this
),然后再准备其他参数。这正是我在我的答案中谈到的关于评估顺序的额外要求。 - AnT stands with Russia