1

在它的cppreference-pagestd::declval显示以下内容:

返回值

无法调用,因此永远不会返回值。

这是什么意思?当我们使用它时,我们肯定会调用它吗?

struct Foo { int func(){}  };

decltype(std::declval<Foo>().func()) integer;
/*                        ^
                          |                      */ 
4

1 回答 1

8

std::declval<T>如果使用 odr,则该程序格式错误。然而,cppreference 试图以一种大多数用户会觉得更容易理解的方式来表达这一点。

对函数的调用或获取函数的地址通常会直接使用该函数。但是,只有在实际评估呼叫/地址时才会出现这种情况。因此,std::declval<T>只要调用未被评估,调用是合法的。(请注意,仅仅证明调用永远不会在运行时发生是不够的。相反,调用必须发生在某些类型的上下文中,在这些上下文中语言的规则阻止它被评估。因此,编译器总是可以检查这一点健康)状况。)

decltype不评估其操作数,因此调用std::declval<T>inside通常是合法的decltype。但是,在某些情况下,操作数的某些部分无论如何都会被求值。例如,decltype(std::array<int, std::declval<int>()>)不会编译,因为它会尝试评估std::declval<int>()以获取数组的大小。

于 2021-12-14T20:01:45.340 回答