Hi,
I have this code where I am not sure the assignments are valid:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
int g(double x) { return std::floor(x); }
double& h(double x) { return x; } // return lvalue reference
double&& i(double x) { return g(x); } // return rvalue reference
void callG() {
auto ag = g(8.8); // ag == int (makes a COPY)
auto ah = h(8.8); // ah == double (makes a COPY)
auto ai = i(8.8); // ai == double (makes a COPY)
//auto& lg = g(8.8); // lg == int& BUT ERROR!!! (reference to temporary variable)- cannot convert from int to int&
auto& lh = h(8.8); // lh == double&
//auto& li = i(8.8); // li == double& ERROR!!! (reference to temporary variable)- cannot convert from double to double&
auto&& rg = g(8.8); // rg == int&&
auto&& rh = h(8.8); // rh == double&
auto&& ri = i(8.8); // ri == double&&
decltype(auto) dg = g(8.8); // dg == int
decltype(auto) dh = h(8.8); // dh == double&
decltype(auto) di = i(8.8); // di == double&&
}
| |
Does variable ri extend the life of the temporary it receives? Can we use ri?
what about di? about rg?
If they can't be used what is their purpose or reason for existing?
Thanks!
Last edited on
h and i return dangling references. All big compilers (GCC, Clang and MSVC) warn about this by default.
Only ag, rg, and dg are safe to use.
Last edited on