gpt4 book ai didi

c++ - 链式静态函数调用之间的参数评估顺序

转载 作者:太空狗 更新时间:2023-10-29 21:05:49 24 4
gpt4 key购买 nike

我很好奇为什么链式静态函数和成员函数之间的参数求值顺序不同。来自 this question 的答案我可以看到未指定此类链接函数调用之间的参数评估顺序是什么。以下面的片段为例:

#include <iostream>
class test {
public:
static test& chain_s(test& t, int i) {
std::cout << i << " ";
return t;
}

test& chain(test& t, int i) {
std::cout << i << " ";
return *this;
}
};

int main(int, char**) {
int x = 2;
test t;
t.chain(t,++x).chain(t,++x).chain(t,++x);
x = 2; std::cout << std::endl;
t.chain_s(t,++x).chain_s(t,++x).chain_s(t,++x);

return 0;
}

在 GCC 4.6.2 和 CL 15.00.30729.01 (MSVC 9) 的情况下,结果输出是给我的

5 5 5
3 4 5

但是,我想知道规范中是否有任何原因,或者是否知道为什么静态函数是从左到右(使用它们的参数)求值的,而对于非静态函数,所有参数都在前(从我在其他测试中看到的从右到左)。

我问这个问题的原因是,当我尝试在 C 中获得类似的行为(使用结构和函数指针)并失败时,我首先注意到了这种行为差异。我强烈怀疑这是在 GCC 和 MSVC 中为成员函数实现的一些优化,但我希望这里有人可以对此进行更多说明。

编辑:
我忘了提到一个让我觉得奇怪的关键信息:GCC 只会对链式非静态函数的未指定行为发出警告,而不是静态函数:

a.cpp: In function 'int main(int, char**)':
a.cpp:18:45: warning: operation on 'x' may be undefined [-Wsequence-point]

GCC 没有义务提供此类警告,因此它可能会错过第二个表达式,但这让我相信发生了一些有趣的事情。

最佳答案

没有理由。就像你说的,语言未指定顺序。

使用从右到左顺序的一个原因是参数数量可变的函数,例如 printf,第一个参数总是在最前面。否则没关系。

关于c++ - 链式静态函数调用之间的参数评估顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8900404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com