Czy ktoś mógłby wyjaśnić, lub wskazać mi jakieś wyjaśnienie, czym jest R-Value? Nie jestem do końca pewien, co to jest, a mój projekt musi go włączyć. Tutaj jest wykazanie co R-Value jest (pierwsza część jest r_string.hpp):Czym dokładnie jest wartość R w C++?
#include <algorithm>
#include <iostream>
template <typename CHAR_T = char>
class basic_rstring {
public:
typedef CHAR_T value_type;
typedef CHAR_T* pointer_type;
typedef CHAR_T const* pointer_const_type;
private:
pointer_type _data;
std::size_t _length;
public:
basic_rstring() : _data(nullptr), _length(0)
{
std::cout << "Default ctor\n";
}
basic_rstring(pointer_const_type s)
: _data(nullptr)
, _length(0)
{
std::cout << "Literal ctor: " << s << std::endl;
_length = strlen(s);
_data = new value_type[ _length + 1 ];
std::copy(s, s + _length + 1, _data);
}
basic_rstring(basic_rstring const& s)
: _data(nullptr)
, _length(s._length)
{
std::cout << "Copy ctor: " << s.c_str() << std::endl;
_data = new value_type [ _length + 1 ];
std::copy(s._data, s._data + s._length + 1, _data);
}
basic_rstring(basic_rstring && s) //move constructor
: _data(s._data)
, _length(s._length)
{
std::cout << "Move ctor: " << s.c_str() << std::endl;
s._data = nullptr;
s._length = 0;
}
~basic_rstring()
{
if(_data)
std::cout << "dtor: " << _data << "\n";
else
std::cout << "NULL dtor\n";
delete [] _data;
}
basic_rstring& operator = (basic_rstring const& s);
basic_rstring& operator = (basic_rstring && s)
{
std::cout << "RValue assignment: " << s.c_str();
if(_data)
std::cout << " deleting...." << std::endl;
else
std::cout << " no delete..." << std::endl;
delete [] _data;
_data = s._data;
s._data = nullptr;
_length = s._length;
s._length = 0;
return *this;
}
pointer_const_type c_str() const { return _data; }
};
template <typename CHAR_T>
basic_rstring<CHAR_T>& basic_rstring<CHAR_T>::operator = (basic_rstring const& s)
{
std::cout << "Copy assignment: " << s.c_str() << std::endl;
pointer_type newData = new value_type [ s._length + 1 ];
std::copy(s._data, s._data + s._length + 1, newData);
_length = s._length;
delete [] _data;
_data = newData;
return *this;
}
typedef basic_rstring<char> String;
typedef basic_rstring<wchar_t> wString;
#define _SCL_SECURE_NO_WARNINGS
#include "Rstring.hpp"
using namespace std;
#define BOOST_TEST_MODULE move_test
#include <boost/test/unit_test.hpp>
template <typename T_>
void old_swap(T_& a, T_&b)
{
T_ hold = a;
a = b;
b = hold;
}
BOOST_AUTO_TEST_CASE(stuff)
{
String s("Bert");
String t("Ernie");
cout << "Old swap" << endl;
old_swap(s,t);
BOOST_CHECK(!strcmp("Bert", t.c_str()));
BOOST_CHECK(!strcmp("Ernie", s.c_str()));
cout << "New swap" << endl;
swap(s,t);
BOOST_CHECK(!strcmp("Bert", s.c_str()));
BOOST_CHECK(!strcmp("Ernie", t.c_str()));
cout << "\nDone." << endl;
}
możliwy duplikat [Co oznacza T && w C++ 11?] (Http://stackoverflow.com/questions/5481539/what-does-t-mean-in-c11) –
możliwy duplikat [Czym są wartości r, wartości l, x wartości, wartości gl i prvalues?] (http://stackoverflow.com/questions/3601602/what-are- wartości-wartościach-wartościach-wartościach-i-wartościach) –
@ Nicol: On pyta o wartość , a nie wartość odniesienia rvalue. Więc bardziej podoba mi się to pytanie. Ale absolutnie pozytywnie dupe. –