为什么模板参数失去恒定性?
Why is the template parameter losing constness?
我认为这是一个非常基本的问题,但我找不到类似的东西。
以下代码无法编译 (C3668)
struct Param
{
int a;
int b;
};
template <typename T>
struct Foo
{
virtual void doStuff (const T) const = 0;
};
struct Bar : public Foo<Param&>
{
void doStuff (const Param &) const override
{
/*...*/
}
};
它将在从中删除常量后编译
void doStuff (const Param &)
我在这里错过了什么?我希望通过我的接口声明强制执行const Param& in Foo::doStuff
。相反,它似乎被删除了。
const
不仅仅是文本替换,它适用于整个类型T
。
如果T
Param&
,const T
和const Param&
不等价;前者与Param& const
相同,等价于Param&
。
如果你写一个不太常见的"postfix-const"形式,它会变得更加明显:无论T
是什么,T const
和Param const &
都不能等价。
因此,您的"覆盖"不会覆盖任何内容,并且您会收到编译错误。
当你有
doStuff (const T)
它与
doStuff (const Param &)
第一个是 T 的常量,所以在这种情况下,你有一个对 T 的常量引用,这真的没有意义,因为引用不能反弹。在后面,它是对const Param
的引用。
你能做的就是改变
struct Bar : public Foo<Param&>
自
struct Bar : public Foo<Param>
然后
virtual void doStuff (const T) const = 0;
自
virtual void doStuff (const T&) const = 0;
问题不在于 const .问题出在覆盖上。 使用 override 声明的成员函数不会重写基类成员
相关文章:
- 主.cpp:18:20:错误:从"int*"转换为"int"会失去精度 [-fa
- 启动类函数作为失去引用的线程
- const_cast静态数组以添加恒常性
- 指针类型类成员的动态强制转换的恒定性是什么?
- 自动模板参数、数据成员和恒常性
- 有没有办法检测自身内部的类恒常性?
- 为什么const_cast删除指针的恒常性,而不删除指向常量的指针的恒常性?
- 为什么对引用的常量引用会失去其恒定性?
- 运算符的要求<恒定性在标准::stable_sort
- 模板参数推导由于恒定性不一致而失败
- 为什么模板参数失去恒定性?
- 为什么普遍引用不保持其论点的恒定性
- 是否可以使用 SFINAE 检测类方法的恒定性?
- 在模板中强制转换为引用似乎会抛弃恒定性
- 在分配对象时保持恒定性
- 常量成员函数中模板成员的恒定性
- 变量的恒定性及其生存期
- 尊重恒定性,同时避免在堆上重新分配
- 参考类成员的恒定性
- 当函数参数常量引用 T 时,为什么 T 的模板参数推导'skips'数组元素的恒定性?