在处理具有以下签名的函数时:
bool getValue(int parameter, int *out)
Run Code Online (Sandbox Code Playgroud)
他们将结果写入由寻址的内存*out并返回一个指示函数是否成功的布尔值,我正在考虑使用以下模式按优先级顺序将这些函数中的几个链接在一起:
int result = 0;
bool success = getValue(param1, &result) || getValue(param2, &result) ||
getAnotherValue(param3, &result);
if (success) {
// do something with result
} else {
// handle error
}
Run Code Online (Sandbox Code Playgroud)
我认为这将是一个更简洁、更漂亮的版本:
int result = 0;
bool success = getValue(param1, &result);
if (!success) {
success = getValue(param2, &result);
if (!success) {
success = getAnotherValue(param3, &result);
}
}
if (success) {
// do something with result
} else {
// handle error
}
Run Code Online (Sandbox Code Playgroud)
据我了解,如果任何一个函数成功,那么||操作员将短路并且不会调用其余的函数,将所需的输出留在result.
这是一种安全的使用模式,尤其是在跨平台的代码中,并且将使用不同的编译器(例如,clang、gcc 和 msvc)进行编译?
如果您要问的是,第二段代码肯定与第一段代码等效。
短路意味着未重载右侧的“未使用”表达式||不会被评估,这意味着函数不会被调用,这意味着&result不会再次被触及。
任何不遵守这些语义的编译器不仅公然不符合 C++ 标准,而且闻所未闻。
但是,对于过载的||. 因此,我们鼓励不要做任何事情。