C++ std::declval如何返回值?
我想尝试编写一个模板包装器来检查类是否有成员函数。 为此,有必要使用std::declvalC++ std::declval如何返回值?,c++,C++,我想尝试编写一个模板包装器来检查类是否有成员函数。 为此,有必要使用std::declval template<typename T> struct has_member<T, void_t<decltype(std::declval<T>().push_back())>>:std::true_type{}; 模板 结构有_成员:std::true_类型{}; 正如我所看到的,declval的实现应该是这样的: template<type
template<typename T>
struct has_member<T, void_t<decltype(std::declval<T>().push_back())>>:std::true_type{};
模板
结构有_成员:std::true_类型{};
正如我所看到的,declval的实现应该是这样的:
template<typename T>
T&& declval() noexcept;
模板
T&&declval()无例外;
实际上,这可能是一个奇怪的问题,但为什么declval没有返回语句呢
如果我理解正确,它应该将右值返回到调用的位置:
template<typename T>
struct has_member<T, void_t<decltype(T&&.push_back())>>:std::true_type{};
模板
结构有_成员:std::true_类型{};
但是我们在实现中不使用return。也许是因为我们没有一个功能体?我想知道为什么这是可能的。我很乐意从以下方面提供帮助:
注意declval只能在未评估的上下文中使用,不需要定义;计算包含此函数的表达式时出错。从形式上讲,如果使用odr函数,则程序的格式是错误的
代码中的用法可以简化为
using type = decltype(std::declval<T>().push_back());
使用type=decltype(std::declval().push_back());
以及:
检查实体的声明类型或表达式的类型和值类别
std::declval
从未被调用,因此它不需要定义。该声明足以让编译器推断其返回类型
换句话说
但是我们在实现中不使用return
declval
没有实现。declval
没有return
语句,因为函数没有实现。如果您试图调用declval
,您将得到一个编译错误
<代码> DECURVA/CODE>存在于C++调用的“未评估上下文”中。在这种情况下,将解析表达式,计算出使用的类型,但永远不会对表达式进行实际计算。给定给
decltype
的表达式是未计算的上下文
尽管declval
没有实现,但它是一个具有定义良好的返回类型的函数。因此,即使您不能实际执行它,编译器也知道declval()
的类型。因此,编译器可以检查包含它的表达式
参见,T&
是一种类型;不能对类型使用
。调用函数的结果是一个对象(或void
),它有一个类型,但本身不是一个类型。你想说的是“假设我有一个T
类型的值,我想对它做X”。你不能用t&
这样说,因为它是一个类型,而不是一个对象。你不想把t
限制在默认可构造的东西上,所以你不能只说t{}
这就是
declval
的用武之地。std::declval
只能在未评估的上下文中使用。试图用它的返回值实际执行任何操作都是错误的。它永远不会被调用,所以不需要实现。但是为什么declval没有返回语句?
因为可能是因为我们没有函数体?
。它没有实现,只是声明了。我们关心的是类型,而不是值。另一个向上投票。你今天着火了@芭丝谢芭,我刚刚结束了一天的工作,找到了一些问题,我可以从中学习,让我远离阳光。但今天就够了。@463035818不是电话号码,谢谢你的回答!非常感谢您提供的详细答案。我是否正确理解了T&
表示未实例化的右值对象(对于不完整的类型)以及对其应用的decltype?编译错误
->链接错误
。