#include <type_traits>
#include <utility>
#include <iostream>
#include <limits>
template<typename T>
class Foo
{
T bar;
template<typename R>
Foo(R&&, typename std::enable_if<!std::is_convertible<R,T>::value>::type * = 0) = delete;
public:
template<typename R>
Foo(R &&bar, typename std::enable_if<std::is_convertible<R,T>::value>::type * = 0)
: bar(std::forward<R>(bar))
{
std::cout << "Initialized from rvalue reference: " <<
std::is_rvalue_reference<decltype(bar)>::value << std::endl;
}
};
int main()
{
int i;
Foo<short> a(i);
Foo<short> b(4);
Foo<short> c(std::numeric_limits<long>::max());
// Causes "error: use of deleted function ‘Foo<T>::Foo(R&&, typename std::enable_if"
//Foo<short> d("failed");
return 0;
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGltaXRzPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgRm9vCnsKICAgIFQgYmFyOwogICAgCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSPgogICAgRm9vKFImJiwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfY29udmVydGlibGU8UixUPjo6dmFsdWU+Ojp0eXBlICogPSAwKSA9IGRlbGV0ZTsKcHVibGljOiAgICAKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFI+CiAgICBGb28oUiAmJmJhciwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxSLFQ+Ojp2YWx1ZT46OnR5cGUgKiA9IDApCiAgICAgICAgOiBiYXIoc3RkOjpmb3J3YXJkPFI+KGJhcikpCiAgICAKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkluaXRpYWxpemVkIGZyb20gcnZhbHVlIHJlZmVyZW5jZTogIiA8PAogICAgICAgICAgICBzdGQ6OmlzX3J2YWx1ZV9yZWZlcmVuY2U8ZGVjbHR5cGUoYmFyKT46OnZhbHVlIDw8IHN0ZDo6ZW5kbDsKICAgIH0KfTsKCmludCBtYWluKCkKewogICAgaW50IGk7CiAgICBGb288c2hvcnQ+IGEoaSk7CiAgICBGb288c2hvcnQ+IGIoNCk7CiAgICBGb288c2hvcnQ+IGMoc3RkOjpudW1lcmljX2xpbWl0czxsb25nPjo6bWF4KCkpOwogICAgCiAgICAvLyBDYXVzZXMgImVycm9yOiB1c2Ugb2YgZGVsZXRlZCBmdW5jdGlvbiDigJhGb288VD46OkZvbyhSJiYsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmIgogICAgLy9Gb288c2hvcnQ+IGQoImZhaWxlZCIpOwogICAgCiAgICByZXR1cm4gMDsKfQo=