gpt4 book ai didi

c++ - std::declval 如何返回一个值?

转载 作者:行者123 更新时间:2023-12-03 23:11:20 32 4
gpt4 key购买 nike

我想尝试编写一个模板包装器来检查类是否具有成员函数。为此,有必要使用 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 没有返回语句?

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

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

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

最佳答案

declval没有return声明,因为该函数没有实现。如果您曾尝试调用 declval ,你会得到一个编译错误。

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

尽管declval没有实现,它是一个具有明确定义的返回类型的函数。所以即使你不能真正执行它,编译器确实知道 declval<T>() 的类型是什么。将。因此,编译器可以检查包含它的表达式。

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

那就是declval进来了。

关于c++ - std::declval 如何返回一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67908211/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com