提问人:Vinod 提问时间:9/14/2023 更新时间:9/14/2023 访问量:41
将add_rvalue_reference和add_lvalue_reference与模板类型结合使用
Using add_rvalue_reference and add_lvalue_reference with template types
问:
我的小测试程序旨在测试模板类型的使用和获取参考。add_rvalue_reference
add_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<>
using
unref<T&>
lvrefarrayofAs
test.h
那么为什么编译器会报告这个错误呢?
短暂性投资安全
答:
-1赞
Andreas DM
9/14/2023
#1
cout << is_same<unref<lvrefarrayofAs>, arrayofAs>::value << endl;
^ ^
这里需要指定 和T
N
lvrefarrayofAs<int, 4>::type
请注意,除非您更改 ->(右值相同),否则您需要 there。::type
add_lvalue_reference
std::add_lvalue_reference_t
您想要 from:type
unref
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>>
评论
lvrefarrayofAs
lvrefarrayofAs<int, 42>
arrayofAs<T>
arrayofAs<int, 42>
A<int>[42]
arrayofAs<int>
std::is_same<unref<lvrefarrayofAs<int, 42>>::type, arrayofAs<int, 42>>::value