C++中能否使用if-else语句实现引用赋值操作?
解答
C++ 引用不支持重新绑定,必须在声明时完成初始化,因此无法先声明无初值的引用,再在 if-else 分支中分别绑定不同对象。但你可以通过以下几种方法实现和条件运算符初始化引用完全等价的效果:
方案1:指针中转(无版本限制、零额外开销)
先在外部作用域声明临时指针,在 if-else 分支中给指针赋值,再用指针初始化引用:
int main (int argc, char *argv[]) { int i, j; int* tmp_ptr = nullptr; if (false) { tmp_ptr = &i; } else { tmp_ptr = &j; } int &k = *tmp_ptr; }
方案2:立即调用Lambda(C++11及以上,无多余变量污染)
通过匿名Lambda在引用初始化时直接完成分支判断,不需要暴露临时指针:
int main (int argc, char *argv[]) { int i, j; int &k = [&]() -> int& { if (false) { return i; } else { return j; } }(); }
编译器开启优化后,该写法生成的代码和直接使用条件运算符完全一致。
方案3:分支内封装逻辑(适合短逻辑场景)
如果引用只需要在分支判断后使用,可以直接把相关逻辑写到每个if-else分支内,在分支内完成引用的声明和初始化:
int main (int argc, char *argv[]) { int i, j; if (false) { int &k = i; // 所有用到k的逻辑写在此处 } else { int &k = j; // 所有用到k的逻辑写在此处 } }
该方案的缺点是会产生代码重复,仅适合使用引用的逻辑非常简短的场景。
内容的提问来源于stack exchange,提问作者24n8
相关产品推荐
相关产品推荐

