std::declval如何返回值?

我想尝试编写一个模板包装器来检查一个类是否具有成员函数。为此,有必要使用 std::declval

template<typename T>
struct has_member<T, void_t<decltype(std::declval<T>().push_back())>>:std::true_type{};

如我所见,declval 的实现应该是这样的:

template<typename T>
T&& declval() noexcept;

实际上,这可能是一个奇怪的问题,但是为什么 declval 没有 return 语句?

如果我理解正确,它应该将右值返回到调用的位置:

template<typename T>
struct has_member<T, void_t<decltype(T&&.push_back())>>:std::true_type{};

但是我们没有在 implementation 中使用 return 。也许是因为我们没有函数体?我想了解为什么这是可能的。我很乐意帮忙

回答

declval没有return语句,因为该函数没有实现。如果您曾尝试调用declval,则会出现编译错误。

declval存在用于 C++ 所谓的“未评估的上下文”。这是一个表达式将被解析的地方,使用的类型计算出来,但表达式永远不会被实际评估。给出的表达式decltype是一个未评估的上下文。

即使declval没有实现,它也是一个具有明确返回类型的函数。因此,即使您无法实际执行它,编译器也确实知道declval<T>()将要执行的类型。因此,编译器可以检查包含它的表达式。

看,T&&是一种类型;您不能.在类型上使用。调用函数的结果是一个对象(或void),它有一个 type,但本身不是一个类型。你想说的是“假设我有一个 type 的值T,我想对它做 X ”。你不能说 withT&&因为它是一个类型,而不是一个对象。而且您不想限制T为默认可构造的事物,因此您不能只说T{}.

这就是declval进来的地方。


以上是std::declval如何返回值?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>