解析模板和const volatile类型

时间:2015-12-08 11:11:49

标签: c++ templates

我在编写模板时发现了以下问题,因此我有两个模板:

第一个很简单,只有typedefs给定类型。它运作得很好。

template <typename T>
struct myType{
    typedef T type;
};

现在我有一个不同的模板,它的内容如下:

struct None{};

template <typename T1=None,typename T2=None>
struct myTypes;

struct None{};
template <typename T1,typename T2>
struct myTypes<T1(T2)>{
    typedef T1 type1;
    typedef T2 type2;
};

所以现在我想测试它们,并按如下方式测试测试用例中断(使用boost::is_same

std::cout << is_same<myType<volatile double>::type,volatile double>::value << std::endl;
std::cout << is_same<myTypes<int(volatile double)>::type2, volatile double>::value << std::endl;

然后,第一次测试通过和打印&#39; 1&#39;以及另一次打印&#39; 0&#39;。但是,当我使用typeid()检查它时,它表示volatilenon-volatile doubles

的加倍

为什么会这样?我不明白。我该如何解决这个问题,以便测试用例正常工作?

1 个答案:

答案 0 :(得分:3)

在函数参数中忽略顶级cv限定符。

以下声明是等效的(即这些是同一函数的重新声明,而不是重载集):

void f(int i);
void f(const int i);
void f(const volatile int i);
void f(volatile int i);

原因是顶级cv限定符引用了复制的参数,因此它只在函数定义中有意义,并且在函数声明和函数声明中没有效果。功能

请注意,不会忽略非顶级cv限定符。以下是一组重载函数,而不是重新声明相同的函数:

  void f(int& i);
  void f(const int& i);
  void f(volatile int& i);