My small test program is aimed at testing the use of add_rvalue_reference and add_lvalue_reference for obtaining references of template types.
//test.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(){}
//main.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;
}
To begin with, I get the following compilation error in 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.
My understanding is that the template array size is not part of its type (please correct me if I am mistaken on this), so not sure why the compiler insists on specifying the template non-type paramter?
The error disappears after I rewrite the two related using declarations in the original code as shown below:
    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>>;
But now I get the following error in 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.
I presume the type of argument 1 passed to is_same<> template is valid, based on the using declarations for both unref<T&>and lvrefarrayofAs in test.h.
So why does the compiler report this error?
TIA
Aucun commentaire:
Enregistrer un commentaire