首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::declval是如何返回值的?

std::declval是如何返回值的?
EN

Stack Overflow用户
提问于 2021-06-09 16:30:09
回答 2查看 460关注 0票数 2

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

代码语言:javascript
复制
template<typename T>
struct has_member<T, void_t<decltype(std::declval<T>().push_back())>>:std::true_type{};

正如我所见,解密的实施应该是这样的:

代码语言:javascript
复制
template<typename T>
T&& declval() noexcept;

事实上,这可能是一个奇怪的问题,但为什么解密没有回报声明?

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

代码语言:javascript
复制
template<typename T>
struct has_member<T, void_t<decltype(T&&.push_back())>>:std::true_type{};

但是我们在实现中不使用返回。也许是因为我们没有功能身体?我想知道为什么这是可能的。我很乐意帮忙

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-09 16:37:28

declval没有return语句,因为函数没有实现。如果您试图调用declval,您将得到一个编译错误。

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

尽管declval没有实现,但它是一个具有定义良好的返回类型的函数。因此,即使您不能实际执行它,编译器也知道declval<T>()的类型。因此,编译器可以检查包含它的表达式。

您看,T&&是一种类型;您不能在类型上使用.。调用函数的结果是一个对象(或void),它有一个类型,但本身不是一个类型。你想说的是“假设我有一个T类型的值,我想对它做X”。T&&不能这么说,因为它是一种类型,而不是对象。而且您不想将T限制在默认可构造的东西上,所以不能简单地说T{}

这就是declval进来的原因。

票数 8
EN

Stack Overflow用户

发布于 2021-06-09 16:35:20

来自优先选择

请注意,declval只能在未计算的上下文中使用,不需要定义;计算包含此函数的表达式是错误的。在形式上,如果这个功能是odr的话,程序是不正确的.

代码中的用法可以简化为

代码语言:javascript
复制
using type = decltype(std::declval<T>().push_back());

decltype

检查实体的声明类型或表达式的类型和值类别。

std::declval从来没有被调用过,所以它不需要定义。该声明足以使编译器推断其返回类型。

换句话说..。

但是我们在实现中不使用返回

declval没有实现。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67908211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档