#include <type_traits>
#include <utility>
#include <iostream>
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);
// Causes "error: use of deleted function ‘Foo<T>::Foo(R&&, typename std::enable_if"
//Foo<short> c("failed");
return 0;
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgRm9vCnsKICAgIFQgYmFyOwogICAgCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSPgogICAgRm9vKFImJiwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfY29udmVydGlibGU8UixUPjo6dmFsdWU+Ojp0eXBlICogPSAwKSA9IGRlbGV0ZTsKcHVibGljOiAgICAKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFI+CiAgICBGb28oUiAmJmJhciwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxSLFQ+Ojp2YWx1ZT46OnR5cGUgKiA9IDApCiAgICAgICAgOiBiYXIoc3RkOjpmb3J3YXJkPFI+KGJhcikpCiAgICAKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkluaXRpYWxpemVkIGZyb20gcnZhbHVlIHJlZmVyZW5jZTogIiA8PAogICAgICAgICAgICBzdGQ6OmlzX3J2YWx1ZV9yZWZlcmVuY2U8ZGVjbHR5cGUoYmFyKT46OnZhbHVlIDw8IHN0ZDo6ZW5kbDsKICAgIH0KfTsKCmludCBtYWluKCkKewogICAgaW50IGk7CiAgICBGb288c2hvcnQ+IGEoaSk7CiAgICBGb288c2hvcnQ+IGIoNCk7CiAgICAKICAgIC8vIENhdXNlcyAiZXJyb3I6IHVzZSBvZiBkZWxldGVkIGZ1bmN0aW9uIOKAmEZvbzxUPjo6Rm9vKFImJiwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWYiCiAgICAvL0ZvbzxzaG9ydD4gYygiZmFpbGVkIik7CiAgICAKICAgIHJldHVybiAwOwp9Cg==