【问题标题】:declval<T> vs declval<T&>declval<T> 与 declval<T&>
【发布时间】:2021-08-22 19:38:01
【问题描述】:

我想了解declval&lt;T&gt;()declval&lt;T&amp;&gt;() 之间的区别?有没有可以使用T&amp;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>);
}

【问题讨论】:

    标签: c++ c++11 decltype


    【解决方案1】:

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

    #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
    }
    

    【讨论】:

      【解决方案2】:

      有没有可以使用T&amp;T 不能使用的示例?

      是的,例如在这种情况下,您有 ref-qualified 重载:

      struct X {
          X() = delete;
          int func() &;
          double func() &&;
      };
      
      int main() {
          // this static_assert would fail:
          static_assert(std::is_same_v<decltype(std::declval<X>().func()), int>);
      }
      

      【讨论】:

        猜你喜欢
        • 2016-06-02
        • 2013-01-17
        • 1970-01-01
        • 1970-01-01
        • 2017-12-31
        • 2020-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多