簡體   English   中英

為什么模板參數會丟失常量?

[英]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

如果TParam&const Tconst Param&不等價; 前者與Param& const相同,相當於Param&
如果你編寫不太常見的“postfix-const”形式就會變得更加明顯:無論T是什么, T T constParam 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM