返回对常量结构(指针类型)成员的引用:明显的左值到右值转换



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

代码:(住在科利鲁(

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

相关内容

  • 没有找到相关文章

最新更新