gpt4 book ai didi

c++ - 返回对 const 结构(指针类型)成员的引用 : apparent lvalue to rvalue conversion

转载 作者:行者123 更新时间:2023-11-30 02:18:51 25 4
gpt4 key购买 nike

给定以下代码,GCC 给出了一些意外的错误和警告。我试图通过引用返回一个结构的成员,它说我正在返回一个临时的!此外,在尝试修复此功能时,它会提示值类别转换错误?在任何情况下,据我所知,对左值对象的成员访问应该产生一个左值,所以这段代码应该首先起作用。怎么了?

代码:(live on 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;
}

产品(海湾合作委员会):

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;
^~~~~~~~~~~~~~~~

关于c++ - 返回对 const 结构(指针类型)成员的引用 : apparent lvalue to rvalue conversion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51737099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com