C++中Lambda内自定义类型编译时运算符操作的问题
编译时Lambda调用失败的原因与解决方法
先看你的代码示例:
struct IntWrapper { consteval IntWrapper operator+(const IntWrapper& other) const { return { x + other.x }; } int x; }; int main() { // 常规方式加法可正常工作 constexpr IntWrapper c1 = IntWrapper{ 1 } + IntWrapper{ 1 }; auto adder = [](IntWrapper x) { return x + x; }; // 使用Lambda执行加法失败 constexpr IntWrapper c2 = adder(IntWrapper{ 1 }); }
失败原因
- Lambda的调用运算符(
operator())默认不是constexpr,哪怕内部调用了consteval函数,整个Lambda也无法在编译时执行。constexpr变量要求初始化表达式是编译时常量表达式,未声明constexpr的Lambda调用不属于这个范畴。 - 你的
operator+是consteval修饰的,这强制要求它必须在编译时执行,但Lambda调用如果不是constexpr,就满足不了这个强制编译的要求,直接导致编译失败。
解决办法
给Lambda显式加上constexpr修饰,让它的调用运算符成为constexpr函数,就能在编译时执行了:
auto adder = [](IntWrapper x) constexpr { return x + x; };
修改后,adder(IntWrapper{1})就属于常量表达式,可用来初始化constexpr变量c2,同时也能满足operator+的consteval要求,编译就能通过。
内容的提问来源于stack exchange,提问作者Matty Muir
相关产品推荐
相关产品推荐

