c++ - 返回对 const stuct(指针类型)成员的引用:明显的左值到右值的转换
问题描述
给定以下代码,GCC 会给出一些意外的错误和警告。我试图通过引用返回一个结构的成员,它说我正在返回一个临时的!另外,在尝试修复此功能时,它会抱怨值类别转换错误?无论如何,据我所知,对左值对象的成员访问应该产生一个左值,所以这段代码应该首先工作。怎么了?
代码:(住在 Coliru 上)
const struct {
int* iptr = nullptr;
} cnst_struct;
const int* const& return_temporary_warning() {
return cnst_struct.iptr;
}
const int*& value_cat_convert_error() {
return cnst_struct.iptr;
}
生产 (GCC):
main.cpp: In function 'const int* const& return_temporary_warning()':
main.cpp:8:24: warning: returning reference to temporary [-Wreturn-local-addr]
return cnst_struct.iptr;
^~~~
main.cpp: In function 'const int*& value_cat_convert_error()':
main.cpp:16:24: error: cannot bind non-const lvalue reference of type 'const int*&' to an rvalue of type 'const int*'
return cnst_struct.iptr;
~~~~~~~~~~~~^~~~
解决方案
通过使结构成员成为指向常量的指针,可以使有问题的代码在没有错误或警告的情况下编译:
const struct {
const int* iptr = nullptr;
} cnst_struct;
或者,通过使函数返回非常量引用。
这里的问题(虽然很微妙)是iptr
成员与返回的引用的衰减类型不完全相同,因此会尝试转换。有一个,即int*
->const int*
但这种转换的结果是一个右值,因此所有的警告和错误。
此外,Clang 会产生不同的警告,这可能更有帮助:
main.cpp:8:12: warning: returning reference to local temporary object [-Wreturn-stack-address]
return cnst_struct.iptr;
^~~~~~~~~~~~~~~~
main.cpp:16:12: error: non-const lvalue reference to type 'const int *' cannot bind to a value of unrelated type 'int *const'
return cnst_struct.iptr;
^~~~~~~~~~~~~~~~
推荐阅读
- django - Django + simplejwt多次登录尝试后的密码锁定
- laravel - Laravel Mews Captcha 未在远程服务器上显示并响应 500 服务器错误
- td-engine - TDengine 数据库中的“show streams”命令会显示多少个连续查询?
- python - 如何在只保留匹配的情况下加入数据框?
- system-verilog - UVM:为什么 get_type_name() 不是静态的?
- scala - 我可以通过一些训练有素的变压器改变火花管道阶段吗?
- javascript - 如何在 Preact 和没有构建工具的情况下使用 useState 钩子?
- r - 创建自己的函数时出现错误消息:
- firebase - 使用 FireBase,我如何检查用户名是否可用于注册?
- python - 如何检查python模块中的变量