1

const_castを使用してconstnessを削除する際に問題が発生しました。エラーメッセージには、「変換は有効な標準変換です.....」と表示されます。

この問題の性質は何ですか?代わりにCスタイルのキャストを使用する必要があるのはなぜですか?

"エラーC2440:'const_cast':'constsize_t'から'size_t'に変換できません""変換は有効な標準変換であり、暗黙的に、またはstatic_cast、Cスタイルのキャスト、または関数スタイルのキャストを使用して実行できます。"

template<typename T>
const IFixedMemory* FixedMemoryPkt<T>::operator=(const IFixedMemory* srcObj)
{
    // doesn't remove constness this way. why?
    const_cast<char*> (this->m_Address) = (char*)srcObj->GetAddress();

    // compile this way, but maybe(?) undefined behaviour
    // const_cast<char*&> (this->m_Address) = (char*)srcObj->GetAddress();

    // doesn't doesn't work too
    const_cast<size_t> (this->m_Size) = (size_t)(srcObj->GetSize());
    // const_cast<size_t> (this->m_Size) = 0;

    return this;
}

template<typename T>
class FixedMemoryPkt : public IFixedMemory
{
private:
    const size_t m_Size;
    const char*  m_Address;
}

class IFixedMemory
{
public:
    virtual const char* GetAddress() const = 0;
    virtual size_t GetSize() const = 0;
}
4

3 に答える 3

8

const_castconstオブジェクトへのポインタまたは参照から、それらの非const同等のものに変換するために使用されます。ただし、オブジェクト自体がである場合、それらを使用して、それらが参照するオブジェクトを変更することはできませんconst。変更する有効な方法はありませんm_Size; 変更する場合は、宣言しないでくださいconst

ポインタ自体はそうではないので、ポインタに割り当てるためにキャストは必要ありませんconst

this->m_Memory = srcObj->GetAddress();

ポインタ自体を。にしたい場合はconst、:のconst来るでしょう。*

char * const m_Address;

また、と同様に、const size_t再割り当てすることはできません。

エラーが示すように、キャストなしで値をその値の非一時的なコピーにconst 変換できconst ます。しかし、あなたはその一時的なものに割り当てることができませんでした。

于 2012-09-07T16:44:33.560 に答える
2

size_tをr値にキャストしようとしていますが、r値に割り当てることはできません。

size_tメンバーの恒常性を捨てることはかなり悪いことだと言わざるを得ません。それが可変の目的です。そして、AFAICSの最初のconstキャストは何の役にも立ちません。

于 2012-09-07T16:46:08.553 に答える
0

今このように動作します...

template<typename T>
const IFixedMemory* FixedMemoryPkt<T>::operator=(const IFixedMemory* srcObj)
{
   this->m_Address = srcObj->GetAddress();
   this->m_Size = srcObj->GetSize();
   return this;
}

template<typename T>
class FixedMemoryPkt : public IFixedMemory
{
private:
    const char* m_Address;
    size_t      m_Size;
};
于 2012-09-07T17:37:03.067 に答える