例如,我有一个这样的函数调用:
std::unique_ptr tmp{new MyClassWithNameFunction};
foo(tmp->name(), std::move(tmp));
是否保证方法调用name()将首先发生?
例如,我有一个这样的函数调用:
std::unique_ptr tmp{new MyClassWithNameFunction};
foo(tmp->name(), std::move(tmp));
是否保证方法调用name()将首先发生?
不,不保证。
此外,大多数编译器将改为从右到左评估参数。
在函数调用中计算参数的顺序是未指定行为的一个示例。此行为取决于实现(编译器),但实现不应记录其行为选择。
顺便说一句,参数的评估顺序不必是从右到左或从左到右。而且,在调用不同的函数时,它可以是不同的。
标准。
翻译。
在计算函数和实际参数之后但在实际调用之前有一个序列点。调用函数中的每个求值(包括对其他函数的调用)在被调用函数的主体执行之前或之后没有特别排序,其相对于被调用函数的执行以未定义的方式定义。
换句话说,函数的执行不是彼此“交错”的。
例子
在函数调用中
函数
f1,f2和可以按任何顺序调用f3。f4所有副作用必须在调用 指向的函数之前完成pf[f1()]。