#include <iostream>
#include <type_traits>
#include <vector>
using namespace std;
template <class T>
class Container
{
public:
template <class UR = T>
void Add(UR&& object)
{
static_assert(std::is_same<std::remove_reference_t<UR>, T>::value, "UR and T should be the same!");
m_Vector.push_back(std::forward<UR>(object));
}
void AddNonUR(T&& object)
{
m_Vector.push_back(std::forward<T>(object));
}
std::vector<T> m_Vector;
};
class Data
{
public:
int x;
int y;
};
int main() {
Container<Data> list;
Data d;
list.Add(d);
// list.AddNonUR(d); // Does not compile
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDx2ZWN0b3I+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3MgQ29udGFpbmVyCnsKICAgIHB1YmxpYzoKICAgIHRlbXBsYXRlIDxjbGFzcyBVUiA9IFQ+CiAgICB2b2lkIEFkZChVUiYmIG9iamVjdCkKICAgIHsKICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxzdGQ6OnJlbW92ZV9yZWZlcmVuY2VfdDxVUj4sIFQ+Ojp2YWx1ZSwgIlVSIGFuZCBUIHNob3VsZCBiZSB0aGUgc2FtZSEiKTsKICAgICAgICAgbV9WZWN0b3IucHVzaF9iYWNrKHN0ZDo6Zm9yd2FyZDxVUj4ob2JqZWN0KSk7CiAgICB9CiAgICB2b2lkIEFkZE5vblVSKFQmJiBvYmplY3QpCiAgICB7CiAgICAJIG1fVmVjdG9yLnB1c2hfYmFjayhzdGQ6OmZvcndhcmQ8VD4ob2JqZWN0KSk7CiAgICB9CiAgICBzdGQ6OnZlY3RvcjxUPiBtX1ZlY3RvcjsKfTsKCmNsYXNzIERhdGEKewogICAgcHVibGljOgogICAgaW50IHg7CiAgICBpbnQgeTsKfTsKCmludCBtYWluKCkgewogICAgQ29udGFpbmVyPERhdGE+IGxpc3Q7CiAgICBEYXRhIGQ7CiAgICBsaXN0LkFkZChkKTsKICAgIC8vIGxpc3QuQWRkTm9uVVIoZCk7IC8vIERvZXMgbm90IGNvbXBpbGUKICAgIHJldHVybiAwOwp9Cg==