C++11は良く分からんので、C言語で。参照でもないけど、実装は似たようなもん。デコンストラクタ問題やオーバーロードや演算子オーバーライドが無いので別物だけど、これはこれで使い道ある気がする。
moveについては、safe_freeのような趣きがあって良ろしいかな。unique_ptrのようなものを作るのにはcoccinelleのようなソフトの支援を借りなければならないけど、coccinelleならコンテキストに依存した複雑な制約を課すことが容易なので、それはそれで色々出来そう。
#include <stddef.h>
#include <stdio.h>
#include <alloca.h>
#define move(p) ({typeof(p) __q = p; p = NULL; __q;})
#define to_rvref(v) ({typeof(v)* __p = alloca(sizeof(v)); *__p = v; __p;})
int *test(){
int *u = NULL, *v = to_rvref(12345678);
printf("%d\n", *v);
u = move(v);
printf("%d\n", *u);
printf("%p\n", v);
return u;
}
__attribute__((optimize("O0")))
void breakstack(){
int **p = alloca(sizeof(int*)*3);
*p++ = NULL;
*p++ = NULL;
*p++ = NULL;
}
int main(){
int *p = test();
breakstack();
printf("%d\n", *p);
}