c – 如何实现remove_reference

我正在学习类型特征和类型转换(修改?),所以我遇到了std :: remove_reference.我试着像这样实现它:

template <class T>
struct remove_reference { typedef T type; };

template <class T>
struct remove_reference<const T> { typedef const T type; };

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

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

现在当我使用它时:

remove_reference<int>::type x1;        // x1 is int : Ok
remove_reference<const int>::type x2;  // x2 is <type> : ???
remove_reference<int&>::type x3;       // x3 is int : Ok
remove_reference<const int&>::type x4; // x4 is <type> : ???

我正在使用Visual Studio 2015,它告诉我x2和x4的类型是< type>那我在这里错过了什么?

注意:

>我正在做{typedef const T type}来删除引用并保持constness …
>我不知道std :: remove_reference的C标准实现

编辑:std :: remove_reference没有任何问题,我只是为了学习而这样做…

最佳答案

I’m doing { typedef const T type } to remove reference and keep constness…

你不需要这样做.如果您删除T&其中T是const X,然后你得到const X.没有必要专门为此.

您确实需要处理右值引用.

所以你的实现应该是:

template <class T>
struct remove_reference { typedef T type; };

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

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

但这并没有改变你的测试无效的事实.使用最近的VC版本,我得到了更多有用的错误:

main.cpp(16):错误C2734:’x2’:’const’对象必须初始化,如果不是’extern’
main.cpp(18):错误C2734:’x4’:’const’对象必须初始化,如果不是’extern’

这正确地告诉您,您正在尝试定义const而不给它赋值.这是不允许的,因为它会有一个不确定的(即垃圾)值,你无法设置它!

这与你的remove_reference无关,如果你写了这个,你会得到同样的错误:

int x1;
const int x2;   // error!
int x3;
const int x4;   // error!

如果初始化const变量,您的测试将正常工作:

remove_reference<int>::type x1;        // x1 is uninitialized
remove_reference<const int>::type x2 = 0;
remove_reference<int&>::type x3;       // x3 is uninitialized
remove_reference<const int&>::type x4 = 0;
点赞