【发布时间】:2012-02-12 14:21:08
【问题描述】:
我很好奇为什么链式静态函数和成员函数之间的参数评估顺序存在差异。从this question 的答案中,我可以看到在这种链式函数调用之间的参数评估顺序是未指定的。以下面的sn-p为例:
#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 没有义务提供此类警告,因此它可能会错过第二个表达式,但这让我相信正在发生一些有趣的事情。
【问题讨论】:
-
在你编写的任何代码中,这样的事情肯定应该是无关紧要的......
-
是的,但我想知道为什么有些代码是错误的,但在类似情况下却不会产生警告。
标签: c++ static chaining sequence-points