将 declval 与引用类型一起使用

Edw*_*ner 6 c++ reference c++11 declval

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

std::declval<T &>()
Run Code Online (Sandbox Code Playgroud)

与以下相反:

std::declval<T>()
Run Code Online (Sandbox Code Playgroud)

T某种类型在哪里。我忽略了为什么可以选择引用符号而不是普通类型的微妙之处。有人可以向我解释一下吗?

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

Enr*_*lis 4

由于参考折叠,结果是不同的(请参阅我在评论中链接的答案),并且它确实会产生后果。

例如,考虑一下成员函数可以被 // 限定的&&事实。&const&

下面是一个简单的(尽管可能毫无意义)示例,说明传递Tvs T&tostd::declval如何产生“巨大”效果。

#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())>);
}
Run Code Online (Sandbox Code Playgroud)