std::declval 不能被调用的语句是什么意思?

What is meant by the statement that std::declval cannot be called?

std::declvalcppreference-page 上,它表示如下:

Return value

Cannot be called and thus never returns a value.

这是什么意思?肯定是我们用的时候调用的吧?

struct Foo { int func(){}  };

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

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

对函数的调用,或获取函数的地址,通常会 odr-use 该函数。但是,只有当 call/address 实际上 被评估 时才会出现这种情况。因此,只要不对调用求值,调用 std::declval<T> 就是合法的。 (请注意,仅仅证明调用永远不会在运行时发生是不够的。相反,调用必须发生在某些类型的上下文中,在这种情况下语言规则阻止它被评估。因此,编译器总是可以检查这个条件。)

decltype 不计算其操作数,因此在 decltype 中调用 std::declval<T> 通常是合法的。但是,在某些情况下,操作数的一部分仍然会被计算。例如,decltype(std::array<int, std::declval<int>()>) 不会编译,因为它会尝试计算 std::declval<int>() 以获得数组的大小。