uint8_t* getBuf() const { return m_buf; } でコンパイルエラーになる

普段ちゃんと const を付けていないので自分でもビックリなところでつまずいてしまった。

#include <stdint.h>

class test
{
public:
    uint8_t* getBuf() { return m_buf; }

private:
    uint8_t m_buf[256];
};

というソースコードで、getBuf() は副作用がないから const を付けた方が良いと考えて、

    uint8_t* getBuf() const { return m_buf; }

と修正したら、

 error: invalid conversion from const uint8_t* to uint8_t*

コンパイルエラーになってしまった。これは const を付けるとメンバ関数内のメンバ関数の型は const 修飾されたように扱われるのが理由らしい。m_buf が const uint8_t* 扱いとなるため、戻り値の型が一致しなくなっている。そのため getBuf() が参照のみを許す書き換えられないバッファを指す場合は、

   const uint8_t* getBuf() const { return m_buf; }

とすればいい。でも書き換えられるバッファを提供する場合は、

    uint8_t* getBuf() { return m_buf; }
    uint8_t* getBuf() const { return const_cast<uint8_t*>(m_buf); }

のいずれかということだろうか?