return C++构造函数的返回值

本文探讨了C++中构造函数的特性及其在LuaBind中的应用方式,展示了如何使用构造函数来创建并立即销毁临时对象,以及这种做法背后的可能原因。

看到这个标题估计大家都很诧异,C++构造函数是没有返回值的,你return个什么劲?

 

看这段LuaBind的诡异代码

 

[cpp]  view plain  copy
 
  1.         call_function(lua_State* L, const char* name BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_OPERATOR_PARAMS, _) )  
  2.         {  
  3.                 assert(name && "luabind::call_function() expects a function name");  
  4.                 typedef boost::tuples::tuple<BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_TUPLE_PARAMS, _)> tuple_t;  
  5. #if BOOST_PP_ITERATION() == 0  
  6.                 tuple_t args;  
  7. #else  
  8.                 tuple_t args(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), &a));  
  9. #endif  
  10.                 typedef typename boost::mpl::if_<boost::is_void<Ret>  
  11.                         , luabind::detail::proxy_function_void_caller<boost::tuples::tuple<BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_TUPLE_PARAMS, _)> >  
  12.                         , luabind::detail::proxy_function_caller<Ret, boost::tuples::tuple<BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_TUPLE_PARAMS, _)> > >::type proxy  
  13. _type;  
  14.   
  15.                 lua_pushstring(L, name);  
  16.                 lua_gettable(L, LUA_GLOBALSINDEX);  
  17.   
  18.                 return proxy_type(L, 1, &detail::pcall, args);  
  19.         }  


最后一行,return 类型proxy_type的构造函数proxy_type()

 

之所以这么调用,是因为可以马上在栈上创建一个临时对象,然后马上销毁这个对象。

为何要这么折腾呢?不清楚。我注意到LuaBind需要在析构函数里调用真正的Lua函数,所以是为了实现 最先绑定的函数 最后才调用 的效果?

 

但是,确实可以return一个没有返回值的函数

 

[cpp]  view plain  copy
 
  1. void donothing()  
  2. {  
  3.     ;  
  4. }  
  5. void callnothing()  
  6. {  
  7.     return donothing();  
  8. }  
  9. int main()  
  10. {  
  11.     donothing();  
  12.     return 0;  
  13. }  


上面代码可以编译并运行通过。

 

另外,这样写(return void)

 

[cpp]  view plain  copy
 
  1. void donothing()  
  2. {  
  3.     return void;  
  4. }  



 

是不行的,因为void是用于声明标识符的,不是实例化的

转载于:https://www.cnblogs.com/lifan3a/articles/7473350.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值