我在写模板的时候发现了如下问题,所以我得到了两个模板:
第一个非常简单,它只是 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;
令人惊讶的是第一个测试通过并打印'1',另一个打印'0'。但是,当我使用 typeid()
检查它的类型时,它说它对于 volatile
和 non-volatile doubles
为什么会这样?我不明白。我该如何解决这个问题,以便测试用例正常工作?
最佳答案
顶级 cv 限定符在函数参数上被忽略。
以下声明是等效的(即这些是同一函数的重新声明,而不是重载集):
void f(int i);
void f(const int i);
void f(const volatile int i);
void f(volatile int i);
原因是顶级 cv-qualifier 指的是 copied 参数,所以它只在函数定义中潜在有意义,对函数声明和函数类型没有影响功能。
请注意,非顶级 cv 限定符不会被忽略。以下是一组重载函数,不是对同一函数的重新声明:
void f(int& i);
void f(const int& i);
void f(volatile int& i);
关于c++ - 解析模板和 const volatile 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34154348/