Aşağıdaki kod yasal mı (C++ 11 ve/veya C++ 14 standart (lar))?Reinterpret_cast (veya herhangi bir oyuncu) xvalues'ı lvalues'e dönüştürebilir mi?
#include <iostream>
#include <utility>
using namespace std;
void foo(int &a) {
cout << a << endl;
}
int main() {
foo(reinterpret_cast<int &>(move(5)));
}
- evet, tanımsız davranış ise?
- Tanımlanmamış bir davranış değilse,
a
'ufoo
içinde UB olmaksızın bile değiştirebilir miyim?
Bu gcc 4.9 üzerinde değil, clang 3.5 üzerinde derler. GCC hatası: Her iki GCC ve Clang için C++, 11 üzerinde çalışır
➤ 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)));
^
Bilginize DÜZENLEME, önceki daha az kıllı bir özel yapılmış döküm ve aşağıdaki lvalue
fonksiyonu olacaktır:
#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;
}
neden standart uyumlu derleyiciyi kullanarak derlemeye ve bundan sonra ne olacağını görmeye çalışmıyorsunuz? standart uyumlu derleyici tarafından – Raptor
@Raptor ben standart kendisi yoruma açık olduğu zaman, hatasız tanımlanmamış derleme davranışına onu açık uygulayacağını ideal kimse. –
GCC'de aldığınız hata mesajından bahsedebilirsiniz. Visual Studio 2013, "C2102 hatası:" ve "l değeri" gerektirir. –