看到这个标题估计大家都很诧异,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是用于声明标识符的,不是实例化的。