【发布时间】:2018-05-04 19:56:05
【问题描述】:
我有一个成员返回const& 的情况,然后此结果在具有相同返回类型的 lambda 中转发。
MSVC2017 将此情况确定为有风险,并发出警告:returning address of local variable or temporary。使用 clang 和其他编译器进行的实证测试表明,这在所有方面都是正确的。我不明白的是,为什么这与返回相同类型的几个方法调用不同。
例如,这很有效:
class A {
public:
const std::string& name() const { return m_name; }
private:
std::string m_name;
};
class B {
public:
const std::string& name() const { return m_a.name(); }
private:
A m_a;
};
//...
B b;
std::cout << b.name();
按预期工作,在编译或运行时没有警告/错误。
但是对于 lambda,它不会:
class A {
public:
const std::string& name() const { return m_name; }
private:
std::string m_name;
};
//...
using Getter = std::function< const std::string&() >;
A a;
Getter g = [&a] { return a.name(); };
std::cout << g();
导致崩溃,或至少打印损坏的内存
有人可以告诉我一些关于为什么这不起作用的信息吗?我通常希望它能够正常工作......
【问题讨论】:
-
请注意,在c++17 中,我会将
std::string const&替换为std::string_view,并且神奇地您的代码可以在零运行时成本和您预期的语义下正常工作。 -
不是您问题的答案,而是:您只有有时需要
std::function(例如,在同一个容器中包装和存储多个 lambda)。其余时间,只需auto g =就完全没问题(而且性能稍微好一点)。 -
@Rakete1111 不,因为 lambda 将返回 视图的副本而不是 字符串的副本,一切都像彩虹和独角兽一样工作.
-
@Yakk 啊,所以你想替换 每个 使用
const std::string&。 :) -
@Rakete1111 是的,作为一般哲学立场,每个
const std::string&都应该替换为std::string_view。但也在 OP 的问题中,它修复了作为副作用的错误。
标签: c++ lambda reference c++14 constants