Является ли следующий код легальным (по стандарту C++ 11 и/или C++ 14)?Может ли reinterpret_cast (или любое преобразование) преобразовать значения xvalues в lvalues?
#include <iostream>
#include <utility>
using namespace std;
void foo(int &a) {
cout << a << endl;
}
int main() {
foo(reinterpret_cast<int &>(move(5)));
}
- Если да, то это неопределенное поведение?
- Если это не неопределенное поведение, могу ли я даже мутировать
a
внутриfoo
без его становления UB?
Он компилируется на clang 3.5, а не на gcc 4.9. Ошибка 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)));
^
EDIT
FYI, выполненный на заказ литая, что меньше волосатые, чем предыдущий, и который работает на C++ 11 и для GCC и Clang, будут следующие lvalue
функции:
#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;
}
Почему вы не пытаетесь скомпилировать его с помощью стандартного совместимого компилятора и посмотреть, что будет дальше? – Raptor
@Raptor стандартным совместимым компилятором Я имею в виду идеальный, который бы реализовал его без ошибок, открыв неопределенное поведение компиляции только тогда, когда сам стандарт открыт для интерпретации. –
Вы можете указать сообщение об ошибке, которое вы получите в GCC. Visual Studio 2013 говорит, что 'ошибка C2102: '&' требует l-value'. –