C++标准是否保证Lambda的可继承性?编译器实现为final类合规吗?
Lambda的可继承性是否由C++标准保证?
答案很明确:C++标准既没有保证闭包类型一定可以被继承,也没有禁止编译器将闭包类型实现为final类——换而言之,两种实现都是符合标准的,具体取决于编译器的选择。
我们先看标准里的定义:
[expr.prim.lambda.closure] lambda表达式的类型(即闭包对象的类型)是一种唯一的、未命名的非联合类类型,称为闭包类型,其属性如下所述。[...]
这段描述只界定了闭包类型的基本属性:唯一、未命名、非联合类,但完全没有提到它是否带有final修饰符。这就给编译器留下了自由实现的空间:
- 有些编译器(比如GCC)会将闭包类型标记为
final,此时你尝试继承lambda的闭包类型会直接编译报错; - 另一些编译器(比如Clang)则允许继承闭包类型,相关代码可以正常编译运行。
举个简单的测试例子:
auto test_lambda = []() { /* 空实现 */ }; class Derived : public decltype(test_lambda) {};
这段代码在不同编译器上的行为是不一致的,这也侧面印证了标准没有统一规定闭包类型的可继承性。
如果你需要一个可继承的"lambda-like"类型,建议不要直接依赖闭包类型的继承性(因为这是不可移植的),而是手动封装一个可继承的类,或者用其他符合标准的方式实现需求。
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

