#include <iostream>
template<typename type>
struct tmp
{
tmp() {}
tmp(const tmp &) = default;
tmp(tmp &&) = default;
tmp(const tmp &&o):tmp(o) {}
tmp(tmp &o):tmp(const_cast<tmp const&>(o)){}
template<class... Ts>
tmp(Ts&&...ts) : v{std::forward<Ts>(ts)...} {}
~tmp () { std::cout << "tmp destructor\n"; }
type v;
};
struct noisy {
~noisy() { std::cout << "bang\n"; }
};
template<class X, class... Ts>
tmp<X> wrap_as_tmp(Ts&&... ts) // used 'tmp<int [4]>' instead of array to track object destruction (but normally it should be an native array type
{
return {std::forward<Ts>(ts)...};
}
int main() {
auto&& x = wrap_as_tmp<noisy[4]>().v;
std::cout << "There\n";
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgdHlwZT4Kc3RydWN0IHRtcAp7CiAgICB0bXAoKSB7fQogICAgdG1wKGNvbnN0IHRtcCAmKSA9IGRlZmF1bHQ7CiAgICB0bXAodG1wICYmKSA9IGRlZmF1bHQ7CiAgICB0bXAoY29uc3QgdG1wICYmbyk6dG1wKG8pIHt9CiAgICB0bXAodG1wICZvKTp0bXAoY29uc3RfY2FzdDx0bXAgY29uc3QmPihvKSl7fQogICAgCiAgICB0ZW1wbGF0ZTxjbGFzcy4uLiBUcz4KICAgIHRtcChUcyYmLi4udHMpIDogdntzdGQ6OmZvcndhcmQ8VHM+KHRzKS4uLn0ge30KCiAgICB+dG1wICgpIHsgc3RkOjpjb3V0IDw8ICJ0bXAgZGVzdHJ1Y3RvclxuIjsgfQoKICAgIHR5cGUgdjsKfTsKCnN0cnVjdCBub2lzeSB7Cgl+bm9pc3koKSB7IHN0ZDo6Y291dCA8PCAiYmFuZ1xuIjsgfQp9OwoKdGVtcGxhdGU8Y2xhc3MgWCwgY2xhc3MuLi4gVHM+CnRtcDxYPiB3cmFwX2FzX3RtcChUcyYmLi4uIHRzKSAvLyB1c2VkICd0bXA8aW50IFs0XT4nIGluc3RlYWQgb2YgYXJyYXkgdG8gdHJhY2sgb2JqZWN0IGRlc3RydWN0aW9uIChidXQgbm9ybWFsbHkgaXQgc2hvdWxkIGJlIGFuIG5hdGl2ZSBhcnJheSB0eXBlCnsKICAgIHJldHVybiB7c3RkOjpmb3J3YXJkPFRzPih0cykuLi59Owp9CgppbnQgbWFpbigpIHsKCWF1dG8mJiB4ID0gd3JhcF9hc190bXA8bm9pc3lbNF0+KCkudjsKCXN0ZDo6Y291dCA8PCAiVGhlcmVcbiI7Cn0K