我在编写模板时发现了以下问题,因此我有两个模板:
第一个很简单,只有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()
检查它时,它表示volatile
和non-volatile doubles
为什么会这样?我不明白。我该如何解决这个问题,以便测试用例正常工作?
答案 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);