From 0387a2c7714e8304a005b398c593d86d2fb062cf Mon Sep 17 00:00:00 2001 From: Kp Date: Sun, 7 Sep 2014 21:54:30 +0000 Subject: [PATCH] Disallow using RAIIdmem::operator T* on rvalues --- SConstruct | 14 ++++++++++++++ common/include/u_mem.h | 5 +++++ 2 files changed, 19 insertions(+) diff --git a/SConstruct b/SConstruct index 1bc036353..b0cfed248 100644 --- a/SConstruct +++ b/SConstruct @@ -747,6 +747,20 @@ int main(int, char **){ if self.Cxx11Compile(context, text=text, msg='for C++11 template aliases'): context.sconf.Define('DXX_HAVE_CXX11_TEMPLATE_ALIAS') @_custom_test + def check_cxx11_ref_qualifier(self,context): + text = ''' +struct A { + int a()&{return 1;} + int a()&&{return 2;} +}; +int main(int, char **){ + A a; + return a.a() != A().a(); +} +''' + if self.Cxx11Compile(context, text=text, msg='for C++11 reference qualified methods'): + context.sconf.Define('DXX_HAVE_CXX11_REF_QUALIFIER') + @_custom_test def check_deep_tuple(self,context): text = ''' #include diff --git a/common/include/u_mem.h b/common/include/u_mem.h index 67e0e4bec..2b2a147ac 100644 --- a/common/include/u_mem.h +++ b/common/include/u_mem.h @@ -111,7 +111,12 @@ struct RAIIdmem : BaseRAIIdmem RAIIdmem() = default; RAIIdmem(std::nullptr_t) : BaseRAIIdmem(nullptr) {} explicit RAIIdmem(T *v) : BaseRAIIdmem(v) {} +#ifdef DXX_HAVE_CXX11_REF_QUALIFIER + operator T*() const & { return static_cast(p); } + operator T*() const && = delete; +#else operator T*() const { return static_cast(p); } +#endif T *operator->() const { return static_cast(p); } };