为什么参考模板参数不推导常量
Why is reference template argument not deducing const?
我编写了以下代码,对于指针,它显示了正确的参数类型,但是当我使用引用时,它只显示int
而没有const
。 为什么?
template <typename T>
void increment(T& x)
{
std::cout << "Argument type is : " << typeid(x).name() << std::endl;
//x = x + 1;
}
template <typename T>
void increment(T* x)
{
std::cout << "Argument type is : " << typeid(x).name() << std::endl;
//x = x + 1;
}
int main()
{
const int x = 0;
const int y = x;
increment(x);
increment(&y);
}
输出:
Argument type is : int
Argument type is : int const *
请问,您能解释一下为什么const
没有参考显示吗?
C++11 §5.2.8/4
C++11 §5.2.8/5"...如果type-id的类型是对可能符合cv条件的类型的引用,则
typeid
表达式的结果引用表示cv-nonqualible引用类型的std::type_info
对象。
" glvalue 表达式的顶级 cv 限定符或作为
typeid
操作数的类型 id 始终被忽略。
本质上,任何顶级const
都会被删除,就像形式函数参数类型一样,生成的函数类型以及引用类型T&
中T
的 CV 限定将被删除。
后者可能是为了不区分T&
和只是T
——它们产生相同的结果。
来自typeid
参考:
如果 type 是引用类型,则结果引用表示引用类型的
std::type_info
对象。
和
在所有情况下,cv 限定符都会被 typeid 忽略(即
typeid(T)==typeid(const T)
)
(更准确地说是顶级const
)T
当然被推导出为const int
。
标准段落是[expr.typeid]/4
和[expr.typeid]/5
相关文章:
- 如何创建长度由常量参数指定的数组
- 常量参数"real"常量吗?
- 常量参数存储在哪里 (C++)?
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 一个模板方法,用于同时接受常量和非常量参数
- 如何在使用 Qt5 构造函数时将非常量参数修改为常量参数?
- C++演示函数同时使用常量参数,即指针,这是为什么?
- C++函数中的常量参数
- 为什么一个方法对同一个变量有常量和非常量参数?
- 重载、常量参数、const_cast、const_cast<字符串 &>
- 提供带有常量参数的函数指针作为带有非常量参数的函数指针是否安全?
- 将函数赋值给函数指针,常量参数正确性
- 完美转发常量参数以进行持续评估
- 为什么重载"<<"需要一个常量参数?
- 我可以有常量参数包吗
- C++-常量参数和类变量是否令人讨厌
- 类的C++常量参数
- C++:复制构造函数,该构造函数使用具有非常量参数的函数
- C++日食给出了常量参数的"Invalid Arguments"
- 如果我使用非常量参数定义那些,我是否仍然会获得默认的复制构造函数和运算符 =