在它的cppreference-page上std::declval显示以下内容:
返回值
无法调用,因此永远不会返回值。
这是什么意思?当我们使用它时,我们肯定会调用它吗?
struct Foo { int func(){} };
decltype(std::declval<Foo>().func()) integer;
/* ^
| */
在它的cppreference-page上std::declval显示以下内容:
返回值
无法调用,因此永远不会返回值。
这是什么意思?当我们使用它时,我们肯定会调用它吗?
struct Foo { int func(){} };
decltype(std::declval<Foo>().func()) integer;
/* ^
| */
std::declval<T>如果使用 odr,则该程序格式错误。然而,cppreference 试图以一种大多数用户会觉得更容易理解的方式来表达这一点。
对函数的调用或获取函数的地址通常会直接使用该函数。但是,只有在实际评估呼叫/地址时才会出现这种情况。因此,std::declval<T>只要调用未被评估,调用是合法的。(请注意,仅仅证明调用永远不会在运行时发生是不够的。相反,调用必须发生在某些类型的上下文中,在这些上下文中语言的规则阻止它被评估。因此,编译器总是可以检查这一点健康)状况。)
decltype不评估其操作数,因此调用std::declval<T>inside通常是合法的decltype。但是,在某些情况下,操作数的某些部分无论如何都会被求值。例如,decltype(std::array<int, std::declval<int>()>)不会编译,因为它会尝试评估std::declval<int>()以获取数组的大小。