• Index

返回值使用引用

Reads: 34

返回值使用左值引用需要注意!!要考虑返回之后的引用是不是还有效!!

基础示例

先举个没问题的完整栗子:

#include <iostream> // std::cout std::endl

int & return_reference(int &a)
{
    std::cout << "调用非const的函数" << std::endl;
    return a;
}

const int & return_reference(const int &a)
{
    std::cout << "带const的函数" << std::endl;
    return a;
}

int main(void)
{
    // 初始化变量a
    int a = 123;
    std::cout << "变量a的值:" << a << std::endl << std::endl;

    // 返回可修改的引用
    return_reference(a) = 2333;
    std::cout << "变量a的值:" << a << std::endl << std::endl;

    // 这里auto推导出的类型是int, 所以变量a的值不会改变
    auto temp1 = return_reference(a); // int temp1 = return_reference(a);
    temp1 = 6666; // 由于temp1只赋值而没有使用, 编译器一般会给出警告
    std::cout << "变量a的值:" << a << std::endl << std::endl;

    // 这里auto &推导出的类型是int &
    auto &temp2 = return_reference(a); // int &temp2 = return_reference(a);
    temp2 = 7777; // temp2就是a的引用
    std::cout << "变量a的值:" << a << std::endl << std::endl;

    // 这里auto &推导出的类型是const int &
    const int &b = a;
    auto &temp3 = return_reference(b); // 调用带const的函数
    // temp3 = 444; // 去掉开头注释将会报错
    std::cout << "变量temp3的值:" << temp3 << std::endl;

    return 0;
}

输出结果:

变量a的值:123

调用非const的函数
变量a的值:2333

调用非const的函数
变量a的值:2333

调用非const的函数
变量a的值:7777

带const的函数
变量temp3的值:7777

基础讲解

这个例子应该说明一切了,就不多说了。以下将讲解要注意的事项。

基础拓展

当你写出下面这个样子时,连编译器都害怕地给出了警告,这个时候就不能忽略警告了:

int & return_reference(void)
{
    int value = 1024;
    return value;
}

这个函数出现了非常可怕的错误。value是一个局部变量,当函数结束时,变量value所占有的内存就会被释放,也就是说value不能再保存数据了,你也不能对value进行操作。而这个函数返回了这个value的引用,无论你是用新的变量保存函数返回的引用的值还是用一个引用来保存这个引用,都会使程序的数据出现混乱甚至崩溃。

返回引用时切记注意变量是否已经不存在。

右值引用不适用于返回值

前面教程中提到的完美转发机制,由于用右值引用作为返回类型会破坏完美转发机制,而用右值引用保存返回值没有什么用,所以右值引用不适用在函数返回值上。


Comments

Make a comment

  • Index

WARNING: You are using an old browser that does not support HTML5. Please choose a modern browser (Chrome / Microsoft Edge / Firefox / Sarafi) to get a good experience.