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