`decltype`也执行表达式的求值吗?

问题描述 投票:0回答:2

在这段代码中,

a + b
是执行了一次还是两次?有什么好的方法来验证这一点?

double num3 = [](double a, double b)->decltype(a + b) { return a + b; }(1.2, 2.1);
c++ c++11 lambda decltype
2个回答
0
投票

为了回答您的问题,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 的许多新功能背后的原因。


0
投票

我刚刚遇到了类似的问题,决定回答这个问题。

[dcl.type.decltype] #1:

decltype
说明符的操作数是一个未评估的操作数

[expr.context] #1:

[...] 未计算的操作数不会被计算。

a + b
中的
decltype(a + b)
未评估。

© www.soinside.com 2019 - 2024. All rights reserved.