declval<T> 与 declval<T&>

use*_*729 3 c++ decltype c++11

我试图理解declval<T>()和之间的区别declval<T&>()?有T&可以使用而T不能使用的例子吗?

#include <type_traits>
#include <utility>

struct X {
  X() = delete;
  int func();
};

int main()
{
// works with both X as well as X& within declval
  static_assert(std::is_same_v<decltype(std::declval<X&>().func()), int>);
}
Run Code Online (Sandbox Code Playgroud)

rus*_*tyx 5

除了 ref 限定的成员函数(很少使用)之外,更常见的用例std::declval<T&>()是创建左值引用(否则它会创建右值引用)。

#include <type_traits>
#include <utility>

struct X {};

int func(X&);

int main() {
  static_assert(std::is_same_v<decltype(func(std::declval<X&>())), int>); // works
  static_assert(std::is_same_v<decltype(func(std::declval<X>())), int>); // error
}
Run Code Online (Sandbox Code Playgroud)