![](/img/trans.png)
[英]Why does template parameter deduction for T 'skips' the constness of array elements when function parameter is const reference to T?
[英]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
{
/*...*/
}
};
它將在刪除const后編譯
void doStuff (const Param &)
我在這里錯過了什么? 我希望通過我的接口聲明強制執行const Param& in Foo::doStuff
。 相反它似乎被刪除了。
const
不僅僅是文本替換,它適用於整個類型T
如果T
是Param&
, const T
和const Param&
不等價; 前者與Param& const
相同,相當於Param&
。
如果你編寫不太常見的“postfix-const”形式就會變得更加明顯:無論T
是什么, 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聲明的成員函數不會覆蓋基類成員
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.