O reinterpret_cast (ou qualquer conversão) converte xvalues em lvalues?
O código a seguir é legal (pelos padrões C ++ 11 e / ou C ++ 14)?
#include <iostream>
#include <utility>
using namespace std;
void foo(int &a) {
cout << a << endl;
}
int main() {
foo(reinterpret_cast<int &>(move(5)));
}
Se sim, é um comportamento indefinido?Se não é um comportamento indefinido, posso até mudara
dentrofoo
sem se tornar UB?Compila no clang 3.5, não no gcc 4.9. Erro no GCC:
➤ g++-4.9 -std=c++1y sample.cpp -o sample
sample.cpp: In function 'int main()':
sample.cpp:11:40: error: invalid cast of an rvalue expression of type 'std::remove_reference<int>::type {aka int}' to type 'int&'
foo(reinterpret_cast<int &>(move(5)));
^
EDITARFYI, um elenco feito sob medida que é menos cabeludo que o anterior e que funciona no C ++ 11 para o GCC e o Clang, seria o seguintelvalue
função:
#include <iostream>
namespace non_std {
template <typename T>
constexpr T &lvalue(T &&r) noexcept { return r; }
}
void divs(int &a, int &b) {
int t = a;
a /= b;
b /= t;
}
int main() {
using namespace std;
using namespace non_std;
int i_care_for_this_one = 4;
divs(i_care_for_this_one, lvalue(2));
cout << i_care_for_this_one << endl;
}