在这段代码中,
a + b
是执行了一次还是两次?有什么好的方法来验证这一点?
double num3 = [](double a, double b)->decltype(a + b) { return a + b; }(1.2, 2.1);
为了回答您的问题,decltype 声明内的表达式的结果不会在运行时计算,但其类型在编译时计算。
所以在假设的陈述中:
double num3 = [](double a, double b)->decltype(a + b) { return a + b; }(1.2, 2.1);
语句
a + b
仅在运行时评估一次。
正如评论中所解释的,上面的语句中根本不需要 decltype() 。它通常用于在更复杂的情况下帮助编译器,例如(在 c++20 中):
// this would not compile without decltype()
auto special_add = [](auto a, auto b) -> decltype(a + b) {
if (a == 0)
return 0; // would default to int, but is explicitly declared as decltype(a + b)
// in the declaration
return a + b;
};
作为一般规则,避免不必要的声明有助于保持代码混乱并使代码更具可读性。这就是 c++11、20 和 23 的许多新功能背后的原因。
我刚刚遇到了类似的问题,决定回答这个问题。
说明符的操作数是一个未评估的操作数。decltype
[...] 未计算的操作数不会被计算。
a + b
中的 decltype(a + b)
未评估。