Saya mendapatkan warning: returning reference to local temporary object dari clang compiler pada kode di bawah ini dan saya tidak yakin mengapa. ( kode pada gdbolt )

<source>: In member function 'const int& Full_Coord::r() const':

<source>:29:41: warning: returning reference to temporary [-Wreturn-local-addr]

   29 |     int const& r() const { return xy_r.r(); }

      |                                   ~~~~~~^~

<source>: In member function 'const int& Full_Coord::ls() const':

<source>:30:36: warning: returning reference to temporary [-Wreturn-local-addr]

   30 |     int const& ls() const { return ls_; }

      |                                    ^~~

Execution build compiler returned: 0

Program returned: 0
#include <iostream>

using SpecialId = uint32_t;
using OtherId = uint32_t;


class Point2D {
public:
    constexpr Point2D(double x, double y, SpecialId r) noexcept:
            x_(x), y_(y), r_(r){}

    double const& x() const { return x_; }
    double const& y() const { return y_; }
    SpecialId const& r() const { return r_; }

private:
    double x_;
    double y_;
    const SpecialId r_;

};


class Full_Coord {
public:
    constexpr Full_Coord(double x, double y, SpecialId r, OtherId ls) noexcept:
            xy_r(x, y, r), ls_(ls) {}

    int const& r() const { return xy_r.r(); }
    int const& ls() const { return ls_; }

private:
    const Point2D xy_r;
    const OtherId ls_;
};

int main(){
    Full_Coord full{1, 2, 3, 4};
    auto const& my_r = full.r();
    return 0;
}

Saya sudah mencoba membaca pertanyaan SO lain yang terkait dengan ini tetapi kebanyakan dari mereka memiliki pengambil yang mengembalikan sementara dari fungsi atau metode. Namun, saya tidak yakin mengapa ini juga terjadi pada kode di atas?

Saya ingin mengembalikan const ref ke anggota pribadi dalam hanya untuk tujuan membaca.

4
Daniel 2 September 2020, 01:45

1 menjawab

Jawaban Terbaik

Itu karena SpecialId dan OtherId adalah uint32_t, dan karena fungsi Anda mengembalikan int, fungsi itu harus dilemparkan secara implisit sehingga sementara dibuat.

Ubah jenis pengembalian Full_Coord::r dan Full_Coord::ls masing-masing menjadi SpecialId dan OtherId, atau gunakan auto sebagai jenis pengembalian.

auto const& r() const { return xy_r.r(); }
auto const& ls() const { return ls_; }
14
anastaciu 1 September 2020, 22:59