c++ 临时对象的构造函数是否保证在其上调用的成员函数的任何参数被求值之前发生?

j2qf4p5b  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(92)

如果我有一个宏,

#define ABORT(msg) AbortHelper(__FILE__, __LINE__).Report(msg)

字符串
是否保证在msg被求值之前调用AbortHelper::AbortHelper(const char*, long)?这很重要,因为我想确保如果像ABORT(GenerateAbortMsg());这样的语句被求值,程序将在该行中止,即使GenerateAbortMsg()抛出异常(通过让AbortHelper::~AbortHelper调用abort或等效函数来实现)。
我对C++标准的所有版本的答案都很感兴趣(如果它们不同的话)

imzjd6km

imzjd6km1#

cppreference.com对evaluation ordering规则的总结足以直接回答这个问题。
在C11之前的基于序列点的规则在这里不给予你任何保证。这里唯一的序列点是在完整表达式的末尾,在函数调用参数的计算和函数调用之间,以及从函数返回时(相对于返回值)。
否则,基于序列点的规则不会指定完整表达式的任何特定求值顺序。完整表达式的不同部分可以按任何顺序求值。
C
11的sequence-before规则,以及以后的规则,也不会给予你任何希望。关于函数调用,它们类似于C++11之前的规则,在函数参数求值、函数调用本身和函数返回值方面指定了功能上类似的规则。
TLDR:没有。

相关问题