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

2 篇文章 0 订阅

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

 

看这段LuaBind的诡异代码

 

        call_function(lua_State* L, const char* name BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_OPERATOR_PARAMS, _) )
        {
                assert(name && "luabind::call_function() expects a function name");
                typedef boost::tuples::tuple<BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_TUPLE_PARAMS, _)> tuple_t;
#if BOOST_PP_ITERATION() == 0
                tuple_t args;
#else
                tuple_t args(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), &a));
#endif
                typedef typename boost::mpl::if_<boost::is_void<Ret>
                        , luabind::detail::proxy_function_void_caller<boost::tuples::tuple<BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_TUPLE_PARAMS, _)> >
                        , luabind::detail::proxy_function_caller<Ret, boost::tuples::tuple<BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_TUPLE_PARAMS, _)> > >::type proxy
_type;

                lua_pushstring(L, name);
                lua_gettable(L, LUA_GLOBALSINDEX);

                return proxy_type(L, 1, &detail::pcall, args);
        }


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

 

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

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

 

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

 

void donothing()
{
    ;
}
void callnothing()
{
    return donothing();
}
int main()
{
    donothing();
    return 0;
}


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

 

另外,这样写(return void)

 

void donothing()
{
    return void;
}

 

 

 

 

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值