【发布时间】:2021-03-13 21:26:12
【问题描述】:
我有一个函数,它的返回类型是一个简单的通用 lambda 表达式。 (此函数返回的 lambda 最终会作为参数传递给 std::transform() 或 std::accumulate() 等 STL 算法。)
当 lambda 没有明确的返回类型时,编译器不会发出警告:
inline auto AccumulateInto() {
return [](const auto& src, const auto& dst) {return dst + src; };
}
当 lambda 明确指定返回类型时:
inline auto AccumulateInto() {
return [](const auto& src, const auto& dst) -> decltype(dst) {return dst + src; };
}
两个编译器都会发出类似的警告:
GCC:返回对临时 [-Wreturn-local-addr] 的引用
MSVC:返回局部变量或临时变量的地址
是否应注意此警告,因为它表明该方法存在缺陷(可能是未定义的行为!)并且应该重构?还是它们是“噪音”?
我无法确定为什么显式指定返回类型会导致返回的表达式是“临时的”,而如果不是这样的话。请解释一下,谢谢!
编辑(添加更多上下文):
对 lambda 使用 auto 参数的愿望是 src 和 dst 可能是不同的类型(例如,一个是 std::uint8_t,一个是 std::uint_16t),但我希望返回 ALWAYS与dst 参数的类型相同,与src 的类型无关。
【问题讨论】:
标签: c++ gcc visual-c++ c++14 generic-lambda