折叠表达式(fold expression)中Lambda未执行致vector为空,如何修复?
修复折叠表达式未执行导致std::vector为空的问题
你的代码问题出在折叠表达式里只定义了lambda但没有调用它,逗号运算符只是依次构造了多个lambda对象,但lambda内部的push_back逻辑完全没被执行,所以最终vector是空的。
修复方案一:调用lambda
在每个lambda定义后添加()执行它,让折叠表达式触发实际的插入操作:
#include <iostream> #include <vector> #include <memory> template<typename... Args> std::vector<std::shared_ptr<int>> createSourceVector(Args... args) { std::vector<std::shared_ptr<int>> result; ( [&]() { result.push_back(std::make_shared<int>(args)); }(), // 新增()调用lambda ...); return result; } int main() { auto sources = createSourceVector(1,2,3); std::cout << sources.size() << '\n'; // 现在输出3 return 0; }
修复方案二:直接折叠push_back操作
如果逻辑简单,完全可以省略lambda,直接对push_back操作进行折叠,代码更简洁:
#include <iostream> #include <vector> #include <memory> template<typename... Args> std::vector<std::shared_ptr<int>> createSourceVector(Args... args) { std::vector<std::shared_ptr<int>> result; (result.push_back(std::make_shared<int>(args)), ...); // 直接折叠表达式 return result; } int main() { auto sources = createSourceVector(1,2,3); std::cout << sources.size() << '\n'; // 输出3 return 0; }
两种方案都能解决问题:第一种适合后续需要扩展复杂逻辑的场景,第二种更轻量化,适合简单的批量插入操作。
内容的提问来源于stack exchange,提问作者qloq
相关产品推荐
相关产品推荐

