decltype是否执行表达式求值?Lambda中a+b执行次数及验证方法
关于decltype的求值问题解答
1. decltype是否会对表达式执行求值操作?
不会。decltype仅用于推导表达式的类型,它只在编译阶段分析表达式的类型信息,完全不会在运行阶段执行表达式里的运算逻辑。
2. 示例代码中a + b会被执行几次?
只会执行一次。代码里的两处a + b作用完全不同:
decltype(a + b)部分:仅用来推导lambda的返回类型,不会触发实际运算;return a + b部分:这是lambda函数的返回语句,会在运行时真正执行一次加法运算。
3. 验证方法
可以自定义一个重载+运算符的类,在运算符函数里添加打印或计数逻辑,通过运行结果直观判断运算次数:
#include <iostream> struct TestNum { double val; TestNum(double v) : val(v) {} // 重载+运算符,添加打印输出 TestNum operator+(const TestNum& other) const { std::cout << "加法运算被执行了一次" << std::endl; return TestNum(val + other.val); } }; int main() { TestNum num3 = [](TestNum a, TestNum b)->decltype(a + b) { return a + b; }(TestNum(1.2), TestNum(2.1)); return 0; }
运行这段代码,控制台只会输出一次加法运算被执行了一次,直接证明decltype里的a + b没有被执行,只有return语句里的加法触发了实际运算。
内容的提问来源于stack exchange,提问作者henry3695
相关产品推荐
相关产品推荐

