2017-09-28 15 views
1

operator float()operator float() constをオーバーロードしようとすると問題が発生しました。私は、両方のオーバーロードを使って、 "do do"と "just read"の異なるバージョンを提供することができると考えましたが、これらのオーバーロードが含まれているクラスの静的インスタンスではそれができません。問題はかなりこれに軽減煮詰めオペレータfloat()とfloat()constを静的メンバーで暗黙的に変換

次の出力を生成し
// Does some math and should convert to float 
struct ToFloat 
{ 
    // float conversion here 
    operator float() 
    { 
    cout << "called operator float() of " << s << "\n"; 
    f += 1.0f; 
    return f; 
    } 

    // just get current value here 
    operator float() const 
    { 
    cout << "called operator float() *const* of " << s << "\n"; 
    return f; 
    } 

    float f; 
    std::string s; 
}; 

// Uses a static and a normal member of ToFloat 
struct Container 
{ 
    // return both instances (with some more math before) 
    operator float() 
    { 
    return s * m; 
    } 

    // just provide read access 
    operator float() const 
    { 
    return s * m; 
    } 

    static inline ToFloat s { 1.0f, "static" }; 
    ToFloat m { 1.0f, "member" }; 
}; 

// Uses the container, but must also provide read-only access 
struct Use 
{ 
    // Give me operator float() of my container 
    float get() 
    { 
    return c; 
    } 

    // Give me operator float() const of my container 
    float getC() const 
    { 
    return c; 
    } 

    Container c {}; 
}; 

int main() 
{ 
    Use u {}; 

    printf("getC() %f \n\n", u.getC()); 
    printf("get() %f \n\n", u.get()); 
    printf("getC() %f \n\n", u.getC()); 
} 

...

called operator float() of static 
called operator float() *const* of member 
getC() 2.000000 

called operator float() of static 
called operator float() of member 
get() 6.000000 

called operator float() of static 
called operator float() *const* of member 
getC() 8.000000 

ToFloatの静的インスタンスが常に使用していますなぜ私は本当に得ることはありませんconstと宣言されている関数から呼び出されたとしても、constの変換はありませんか?ここにどんなルールが適用されますか?

+2

静的メンバは、クラスのインスタンスが 'const'であるという理由だけで、' const'ではありません。また、そのインスタンスのコードからは* constとして表示されません。無関係ですが、デフォルトの 'double'の代わりに' float'を使用するのは、一般的に単なるsillywarningsの招待であり、メンテナはあなたが何をしているのか理解しようと時間を無駄にしています。 –

+0

ターゲットプラットフォームでハードウェアでダブルをサポートしていません。 – Vinci

+0

@ Cheersandhth.-Alf 'float'と' double'は本当ですか?私は数多くのコードでは、「倍精度」の精度がスピードとメモリのコストに見合っています。 – Angew

答えて

1

静的データメンバーContainer::sは、単純にタイプToFloatです。常に直接アクセスされます。thisという暗黙の逆参照によって決してアクセスされることはありません。つまり、コンテナのconstオペレータが効果的にこれです:

operator float() const 
{ 
    return Container::s * this->m; 
} 

このことから、Container::sthisconst Container *であるという理由だけでconstとして扱われるためには理由がありませんことは言うまでもないです。あなたはそれがconstとして扱われたい場合は、明示的にそれを修飾する必要があります。

operator float() const 
{ 
    return std::as_const(s) * m; 
} 
関連する問題