将add_rvalue_reference和add_lvalue_reference与模板类型结合使用

Using add_rvalue_reference and add_lvalue_reference with template types

提问人:Vinod 提问时间:9/14/2023 更新时间:9/14/2023 访问量:41

问:

我的小测试程序旨在测试模板类型的使用和获取参考。add_rvalue_referenceadd_lvalue_reference

测试.h

#include<cstddef>
#include <type_traits>

using std::size_t;
using std::add_lvalue_reference;
using std::add_rvalue_reference;

template<class T>
  struct unref {typedef T type;};
template<class T> 
  struct unref<T&>{typedef T type;};
template<class T> 
  struct unref<T&&>{typedef T type;};

template<typename T>
class A{
   public:
   constexpr A(T);
   constexpr ~A();
   private:
   A()=delete; 
   A(const A&)=delete;
   A& operator=(const A&)=delete;
   private:
   T elem;
};

template<typename T, size_t N>
using arrayofAs = A<T>[N];

template<typename T, size_t N>
using lvrefarrayofAs = add_lvalue_reference<arrayofAs<T>>;

template<typename T, size_t N>
using rvrefarrayofAs = add_rvalue_reference<arrayofAs<T>>;

template<typename T> constexpr A<T>::A(T elem):elem(elem){}
template<typename T> constexpr A<T>::~A(){}

主 .cpp

#include "test.h"
#include <iostream>

using std::is_same;
using std::cout;
using std::endl;

int main (){

  cout << is_same<unref<lvrefarrayofAs>, arrayofAs>::value << endl;  
  cout << is_same<unref<rvrefarrayofAs>, arrayofAs>::value << endl;  

  return 0;
}

首先,我在以下方面出现以下编译错误:test.h

In file included from main.cpp:1:
test.h:35:55: error: wrong number of template arguments (1, should be 2)
   35 | using lvrefarrayofAs = add_lvalue_reference<arrayofAs<T>>;
      |                                                       ^
compilation terminated due to -Wfatal-errors.

我的理解是模板数组大小不是其类型的一部分(如果我弄错了,请纠正我),所以不确定为什么编译器坚持指定模板非类型参数?

在我重写原始代码中的两个相关声明后,错误消失了,如下所示:using

    template<typename T, size_t N>
    using lvrefarrayofAs = add_lvalue_reference<arrayofAs<T,N>>;
    
    template<typename T, size_t N>
    using rvrefarrayofAs = add_rvalue_reference<arrayofAs<T,N>>;

但是现在我在main.c中出现以下错误:

main.cpp: In function ‘int main()’:
main.cpp:21:39: error: type/value mismatch at argument 1 in template parameter list 
for ‘template<class T> struct unref’
   21 |   cout << is_same<unref<lvrefarrayofAs>, arrayofAs>::value << endl;
      |                                       ^
compilation terminated due to -Wfatal-errors.

我假设传递给模板的参数 1 的类型是有效的,基于两者和 in 的声明。is_same<>usingunref<T&>lvrefarrayofAstest.h

那么为什么编译器会报告这个错误呢?

短暂性投资安全

C++ C++11 模板 器错误 相同

评论

0赞 HolyBlackCat 9/14/2023
这里似乎存在一些非常基本的误解。 不是一个类型,而是一个类型。目前还不清楚你期望做什么。 是,但会是什么?lvrefarrayofAslvrefarrayofAs<int, 42>arrayofAs<T>arrayofAs<int, 42>A<int>[42]arrayofAs<int>
0赞 Jarod42 9/14/2023
你可能想要.std::is_same<unref<lvrefarrayofAs<int, 42>>::type, arrayofAs<int, 42>>::value
0赞 Vinod 9/14/2023
@HolyBlackCat感谢您指出我理解中的缺陷......

答:

-1赞 Andreas DM 9/14/2023 #1
cout << is_same<unref<lvrefarrayofAs>, arrayofAs>::value << endl;
                                    ^           ^

这里需要指定 和TN

lvrefarrayofAs<int, 4>::type

请注意,除非您更改 ->(右值相同),否则您需要 there。::typeadd_lvalue_referencestd::add_lvalue_reference_t

您想要 from:typeunref

unref<lvrefarrayofAs<int, 4>::type>::type

然后,表达式变为

is_same<unref<lvrefarrayofAs<int, 4>::type>::type, arrayofAs<int, 4>>::value

is_same_v<unref<lvrefarrayofAs<int, 4>::type>::type, arrayofAs<int, 4>>