无法调用 std::declval 的语句是什么意思?

Jen*_*nsB 1 c++ std declval

cppreference-page上有std::declval以下内容:

返回值

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

这是什么意思?我们在使用的时候肯定会调用它吗?

struct Foo { int func(){}  };

decltype(std::declval<Foo>().func()) integer;
/*                        ^
                          |                      */ 
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 9

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

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

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