https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118670
Bug ID: 118670
Summary: -Wdangling-reference false positive when returning a
reference from a reference_wrapper
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: llvm at rifkin dot dev
Target Milestone: ---
Gcc diagnoses the following as a possibly-dangling reference:
#include <string>
#include <functional>
class R {
std::reference_wrapper<const std::string> v;
public:
R(std::string& u) : v(u) {}
const std::string& value() {
return v;
}
};
std::string x;
R get_str() {
return x;
}
void foo() {
const auto& str = get_str().value();
}
<source>: In function 'void foo()':
<source>:21:17: warning: possibly dangling reference to a temporary
[-Wdangling-reference]
21 | const auto& str = get_str().value();
| ^~~
<source>:21:38: note: the temporary was destroyed at the end of the full
expression 'get_str().R::value()'
21 | const auto& str = get_str().value();
| ~~~~~~~~~~~~~~~^~
<source>:21:17: warning: unused variable 'str' [-Wunused-variable]
21 | const auto& str = get_str().value();
| ^~~
Compiler returned: 0
https://godbolt.org/z/6qc7697G3
If I change `std::reference_wrapper<const std::string> v;` to `const
std::string& v;` there's no warning.