为何BOOST_HOF_LIFT在MSVC上报C2892错误,BOOST_HOF_LIFT_CLASS却正常?
MSVC下BOOST_HOF_LIFT编译失败但BOOST_HOF_LIFT_CLASS正常的原因
问题现象
以下使用BOOST_HOF_LIFT的代码在MSVC中编译失败:
#include <boost/hof/lift.hpp> int foo(int); int foo(double); inline auto bar = BOOST_HOF_LIFT(foo); int main() { bar(1); bar(1.1); }
而使用BOOST_HOF_LIFT_CLASS的代码可正常编译:
#include <boost/hof/lift.hpp> int foo(int); int foo(double); BOOST_HOF_LIFT_CLASS(Baz, foo); inline auto baz = Baz{}; int main() { baz(1); baz(1.1); }
Clang与GCC对两段代码均能正常编译,MSVC的报错信息为:
<source>(4): error C2892: a template cannot be a member of a local class
原因分析
BOOST_HOF_LIFT的宏实现逻辑是在lambda表达式内部定义一个局部类,再返回该类的实例。虽然代码中包含针对_MSC_VER的条件编译分支,但MSVC存在语法限制:不允许局部类拥有模板成员。而BOOST_HOF_LIFT生成的局部类为了支持重载函数的多态调用,定义了模板化的调用运算符,这直接触发了C2892错误。
反观BOOST_HOF_LIFT_CLASS,它是在全局/命名空间作用域直接定义顶层类,不属于局部类范畴,不受MSVC的这个限制,因此可以正常编译。
内容的提问来源于stack exchange,提问作者Enlico
相关产品推荐
相关产品推荐

