调用含左值引用参数的函数时,如何就地声明左值避免显式变量定义?
可行的几种解决方案
以下是几种不用显式定义独立变量就能合法调用该函数的方法,均符合C++标准:
Lambda返回静态变量引用(C++11及以上)
用匿名lambda就地创建一个静态int变量并返回其引用,静态变量的生命周期贯穿整个程序,调用时不会有未定义行为:auto calc_result = calc(data_vec, []() -> int& { static int dummy; return dummy; }());由于我们不关心
sub_sum的输出值,静态变量的初始值和后续修改都不会影响逻辑,完全满足需求。直接使用静态临时变量的引用(C++11及以上)
借助std::ref包装一个静态初始化的int变量,省去lambda的写法:#include <functional> // 需要包含此头文件 auto calc_result = calc(data_vec, std::ref(static int{}));这里的
static int{}是左值,std::ref会返回一个std::reference_wrapper<int>,它可以隐式转换为int&,刚好匹配函数参数。C++20及以上:就地封装变量声明
用lambda把变量声明和函数调用封装在一起,实现“就地”效果,变量仅在当前lambda作用域有效:auto calc_result = [&]() { int dummy; return calc(data_vec, dummy); }();
内容的提问来源于stack exchange,提问作者beng in
相关产品推荐
相关产品推荐

