c++ - 解析模板和 const volatile 类型

标签 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;

令人惊讶的是第一个测试通过并打印'1',另一个打印'0'。但是,当我使用 typeid() 检查它的类型时,它说它对于 volatilenon-volatile doubles

都是 double 的

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

最佳答案

顶级 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/

相关文章:

c++ - 模板实例化问题

c++ - 是否有 c++ 特性可以在 C++ 中的两种类型之间找到最受限制的类型?

c++ - 如何序列化为原始内存块?

c++ - 无损转换 std::string 和 QByteArray 的正确方法

c++ - 如何处理 “signed/unsigned mismatch” 警告(C4018,无循环)?

c++ - 泛化模型中的数据访问。避免宏的方法?

c++ - 你能从模板参数函数签名中提取类型吗

C++14 元组类型索引在我想成为 std::function 的 std::bind 推断类型上失败

c++ - std::move、std::forward、值类型和模板推导

c++ - boost make_shared 接受一个 const 引用。有什么办法可以解决这个问题?