我想尝试编写一个模板包装器来检查一个类是否有一个成员函数。为此,有必要使用std::declval
template<typename T>
struct has_member<T, void_t<decltype(std::declval<T>().push_back())>>:std::true_type{};正如我所见,解密的实施应该是这样的:
template<typename T>
T&& declval() noexcept;事实上,这可能是一个奇怪的问题,但为什么解密没有回报声明?
如果我正确理解,它应该将rvalue返回到它调用的位置:
template<typename T>
struct has_member<T, void_t<decltype(T&&.push_back())>>:std::true_type{};但是我们在实现中不使用返回。也许是因为我们没有功能身体?我想知道为什么这是可能的。我很乐意帮忙
发布于 2021-06-09 16:37:28
declval没有return语句,因为函数没有实现。如果您试图调用declval,您将得到一个编译错误。
declval存在于C++所称的“未评估上下文”中。这是在一个表达式将被解析、使用的类型被计算出来的地方,但是表达式将永远不会被实际计算。给decltype的表达式是一个未计算的上下文。
尽管declval没有实现,但它是一个具有定义良好的返回类型的函数。因此,即使您不能实际执行它,编译器也知道declval<T>()的类型。因此,编译器可以检查包含它的表达式。
您看,T&&是一种类型;您不能在类型上使用.。调用函数的结果是一个对象(或void),它有一个类型,但本身不是一个类型。你想说的是“假设我有一个T类型的值,我想对它做X”。T&&不能这么说,因为它是一种类型,而不是对象。而且您不想将T限制在默认可构造的东西上,所以不能简单地说T{}。
这就是declval进来的原因。
https://stackoverflow.com/questions/67908211
复制相似问题