#include <iostream>
#include <utility>
#include <functional>
using namespace std;
// -----------------------------------------------
template<typename T, typename F>
struct Test
{
T m_resource;
F m_deleter;
Test(T&& resource, F&& deleter)
: m_resource(move(resource)), m_deleter(move(deleter))
{
}
Test(T const& resource, F const& deleter)
: m_resource(resource), m_deleter(deleter)
{
}
};
// -----------------------------------------------
// -----------------------------------------------
template<typename T, typename F>
Test<T, F> test(T&& t, F&& f)
{
return Test<T, F>(move(t), move(f));
}
template<typename T, typename F>
Test<T, F> test(T const& t, F const& f)
{
return Test<T, F>(t, f);
}
// -----------------------------------------------
int main()
{
// construct from temporaries --------------------
Test<int*, function<void(int*)>> t(new int, [](int *k) {}); // OK - constructor
auto tm = test(new int, [](int *k){}); // OK - maker function
// -----------------------------------------------
// construct from l-values -----------------------
int *N = new int(24);
auto F = function<void(int*)>([](int *k){});
Test<int*, function<void(int*)>> tt(N, F); // OK - construction
//auto m = test(N, F); // Error - maker function
// -----------------------------------------------
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRj4Kc3RydWN0IFRlc3QKewoJVCBtX3Jlc291cmNlOwoJRiBtX2RlbGV0ZXI7IAoJCglUZXN0KFQmJiByZXNvdXJjZSwgRiYmIGRlbGV0ZXIpIAoJOiBtX3Jlc291cmNlKG1vdmUocmVzb3VyY2UpKSwgbV9kZWxldGVyKG1vdmUoZGVsZXRlcikpCgl7Cgl9CglUZXN0KFQgY29uc3QmIHJlc291cmNlLCBGIGNvbnN0JiBkZWxldGVyKSAKCTogbV9yZXNvdXJjZShyZXNvdXJjZSksIG1fZGVsZXRlcihkZWxldGVyKQoJewoJfQp9OwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRj4KVGVzdDxULCBGPiB0ZXN0KFQmJiB0LCBGJiYgZikKewoJcmV0dXJuIFRlc3Q8VCwgRj4obW92ZSh0KSwgbW92ZShmKSk7Cn0KdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRj4KVGVzdDxULCBGPiB0ZXN0KFQgY29uc3QmIHQsIEYgY29uc3QmIGYpCnsKCXJldHVybiBUZXN0PFQsIEY+KHQsIGYpOwp9Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppbnQgbWFpbigpIAp7CgkvLyBjb25zdHJ1Y3QgZnJvbSB0ZW1wb3JhcmllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLQoJVGVzdDxpbnQqLCBmdW5jdGlvbjx2b2lkKGludCopPj4gdChuZXcgaW50LCBbXShpbnQgKmspIHt9KTsgLy8gT0sgLSBjb25zdHJ1Y3RvcgoJYXV0byB0bSA9IHRlc3QobmV3IGludCwgW10oaW50ICprKXt9KTsgICAgICAgICAgICAgICAgICAgICAgLy8gT0sgLSBtYWtlciBmdW5jdGlvbgoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQoJLy8gY29uc3RydWN0IGZyb20gbC12YWx1ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWludCAqTiA9IG5ldyBpbnQoMjQpOwoJYXV0byBGID0gZnVuY3Rpb248dm9pZChpbnQqKT4oW10oaW50ICprKXt9KTsKCQoJVGVzdDxpbnQqLCBmdW5jdGlvbjx2b2lkKGludCopPj4gdHQoTiwgRik7IC8vIE9LICAgIC0gY29uc3RydWN0aW9uCgkvL2F1dG8gbSA9IHRlc3QoTiwgRik7ICAgICAgICAgICAgICAgICAgICAgICAvLyBFcnJvciAtIG1ha2VyIGZ1bmN0aW9uCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCglyZXR1cm4gMDsKfQ==