对结构成员的临时绑定引用
Temporary bound references to struct members
我正在某个代码库上尝试Coverity,我收到了类似于以下内容的代码警告
struct Foo
{
std::string name;
};
Foo getFoo();
//...
const auto& name = getFoo().name;
useName(name);
此代码有效吗?
我直觉它确实是无效的。但是,在搜索证明时,我遇到了[class.temporary]/6.4,它似乎说它实际上是格式良好的。然而,Coverity发出了警告,Coverity肯定是由一些聪明的人编写的,他们比我更能解释标准。
发出的特定覆盖性警告是
取消引用返回或超出范围的堆栈指针将在其作用域之后或函数返回后访问堆栈上的无效位置。
In whateverSurroundingFunction((:指向在作用域外返回或使用的局部堆栈变量的指针 (CWE-562(
关于name
的后续使用.前面的警告是
out_of_scope:类型
Foo
的临时变量超出范围
这是一种 MRE(在评论中@user4581301点赞(。
SO 有很多关于临时绑定引用的问题,但我看到的那些每个都有略有不同的上下文,因此这里有另一个关于它们的问题。
此代码格式正确。正如链接标准所说,getFoo()
返回的临时的生存期将延长到引用变量name
的生存期。
(强调我的(
每当引用绑定到临时对象或其子对象时,临时对象的生存期都会延长以匹配引用的生存期
引用直接绑定到临时Foo
的子对象name
,然后生存期得到延长。其他方法,例如通过返回对数据成员的引用的成员函数绑定引用将不起作用。
struct Foo
{
std::string name;
std::string& get_name() { return name; }
};
Foo getFoo();
然后
const auto& name = getFoo().get_name();
std::cout << name << std::endl; // UB; name is dangled
住
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 将常量指针引用绑定到非常量指针
- 运行时错误:引用绑定到类型为"int"的空指针
- 了解C++如何返回引用并绑定到引用
- 模板允许左值与右值引用绑定
- 为什么结构化绑定不使用"auto&"返回对结构成员的引用,而是返回成员本身
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 无法将类型"T&"的非常量左值引用绑定到类型"T"的右值 t++ std::atomic<T>
- C++通过绑定到引用成员而缩短临时变量寿命?
- C++初始化 std::function 时如何将占位符绑定到引用/引用参数?
- 在其他容器中使用 boost::container::static_vector 时,GCC 编译错误"将'const s'绑定到类型's&'的引用丢弃限定符"
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- 对结构成员的临时绑定引用
- 错误:在类型 "blah blah" 的绑定引用中删除限定符以初始化"some other blah blah"
- 为什么我可以在初始化引用后重新绑定引用?
- 为什么按引用传入会导致绑定引用类型错误
- 返回非常量引用会导致绑定引用错误
- 递归到迭代而不重新绑定引用
- 类型绑定引用中的限定符和 const 类型的初始值设定项中删除
- 为什么C++不允许重新绑定引用?