我想知道以下情况:
void f(int a, int b) { }
int a(int x) { std::cout << "func a" << std::endl; return 1; }
int b(int x) { std::cout << "func b" << std::endl; return 2; }
int x() { std::cout << "func x" << std::endl; return 3; }
int y() { std::cout << "func y" << std::endl; return 4; }
f(a(x()), b(y()));
看完之后http://en.cppreference.com/w/cpp/language/eval_order http://en.cppreference.com/w/cpp/language/eval_order我仍然很难理解以下评估顺序是否可能:
x()
-> y()
-> a()
-> b()
或者该标准保证a(x())
and b(y())
可以这么说,将被评估为单位。
换句话说,这是否有可能打印
func x
func y
func a
func b
在 GCC 5.4.0 上运行这个测试让我觉得更符合逻辑
func y
func b
func x
func a
但这当然并没有告诉我任何有关标准要求的信息。最好能获得该标准的参考。
在 C++14 及更早版本中,x -> y -> a -> b
是可能的。这里的先后顺序关系是:
- Call to
x
在调用之前排序a
.
- Call to
y
在调用之前排序b
.
- Call to
a
在调用之前排序f
.
- Call to
b
在调用之前排序f
.
订单没有其他限制。如果您想强制执行某些特定的顺序,那么您必须将此调用分解为多个完整表达式。
在 C++14 标准中,注释 [expr.call]/8 阐明了这一意图:
[Note:后缀表达式和参数的计算相对于彼此都是无序的。在输入函数之前,参数计算的所有副作用都会被排序。 —end note ]
正如评论中指出的,cpp参考页 http://en.cppreference.com/w/cpp/language/eval_order列出了更多标记为“Since C++17”的排序规则。这是基于n4606 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf,最新发布的 C++17 草案。所以对于C++17来说,这个顺序可能不再被允许。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)