为何GCC接受返回值类型的函数绑定到返回const引用的std::function?
关于
std::function<const int&()>绑定返回值可调用对象的编译问题 为什么带
const可以编译通过?
C++标准允许将右值(比如return 1生成的临时int对象)绑定到const T&类型的引用,且会延长该临时对象的生命周期。但这里存在关键陷阱:当你把返回T的可调用对象适配到std::function<const T&()>时,每次调用这个std::function都会生成新的临时T对象,返回的const引用仅在当前调用表达式的生命周期内有效,后续使用该引用必然触发悬垂引用,属于未定义行为。而去掉
const后,std::function<int&()>要求返回非const左值引用,但C++禁止非const左值引用绑定到右值,因此编译器直接报错,这完全符合语言规则。为什么GCC 9.4.0开启
-Wall -Wextra也无警告?
这类悬垂引用属于运行时未定义行为,编译器的静态分析很难精准识别std::function适配后的场景:std::function的类型擦除机制会隐藏内部细节,编译器无法追踪到每次调用时临时对象的生命周期风险。-Wall -Wextra仅覆盖常见编译期警告,并不包含这类需要深度追踪运行时逻辑的检测,目前GCC也没有默认开启的警告选项能识别该场景。验证悬垂引用的影响
你可以尝试运行以下代码,会直接触发未定义行为:std::function<const int& ()> f = []() -> int { return 1; }; const auto& val = f(); std::cout << val << std::endl; // 此时临时对象已销毁,引用悬垂,输出结果随机或崩溃
内容的提问来源于stack exchange,提问作者Graham K.
相关产品推荐
相关产品推荐

