C++ std::declval如何返回值?

C++ 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

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

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?
编译错误
->
链接错误