首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对引用类型使用declval

对引用类型使用declval
EN

Stack Overflow用户
提问于 2021-04-29 04:18:47
回答 1查看 79关注 0票数 2

我看到了一些代码示例,其中用于实例化std::declval模板函数的类型被指定为引用类型,而不仅仅是一个类型,如下所示:

代码语言:javascript
复制
std::declval<T &>()

与此相对的是:

代码语言:javascript
复制
std::declval<T>()

其中T是某种类型。我错过了为什么引用符号可能会被选择而不是普通类型的微妙之处。有人能给我解释一下吗?

我知道std::declval扩展到了typename std::add_rvalue_reference<T>::type,但是我仍然不明白为什么要通过引用类型而不是普通类型本身来实例化后者。

EN

回答 1

Stack Overflow用户

发布于 2021-04-29 04:27:16

由于引用折叠,结果是不同的(见the answer I linked in a comment),它确实有后果。

例如,考虑到成员函数可以是&&/&/const&限定的。

下面是一个简单的示例,尽管可能没有意义,但它说明了如何将TT&传递给std::declval可以产生“剧烈”的效果。

代码语言:javascript
复制
#include <type_traits>
struct A{};
struct B{};

struct C {
    A f() && { return A{}; }
    B f() const & { return B{}; }
};
int main() {
    static_assert(std::is_same_v<A, decltype(std::declval<C>().f())>);
    static_assert(std::is_same_v<B, decltype(std::declval<C&>().f())>);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67307362

复制
相关文章

相似问题

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