当底层 OpenGL 状态被修改时,我是否应该声明一个方法 const

Should I declare a method const, when underlying OpenGL state is modified

下面class封装了一个缓冲区的OpenGL名称,并提供了几个改变缓冲区状态的方法:

class BufferObject {
    public:
        explicit BufferObject( GLenum type );
        virtual ~BufferObject();

        // some methods omitted

        void    dataStore( GLsizeiptr size, const GLvoid* data, int usage );
        void*   mapBufferRange( GLintptr offset, GLsizeiptr length, int accessFlag );
        void    unmapBuffer() const;
    private:
        GLuint object_;
};

None 这些方法改变了 BufferObject 对象的状态,因此它们都可以用 const 声明。但是,dataStoremapBufferRange 都调用 OpenGL 方法来更改 GPU 上对象的状态(分别为 glBufferDataglMapBufferRange)。我想在没有 const 的情况下声明它们,以表明它们正在修改 GPU 上的状态。

在这种情况下应遵循的最佳做法是什么?

你是对的,因为他们不修改对象本身的实际状态,你可以选择。

虽然没有硬性规定,但 "use const wherever possible" 绝对不是通用的方法。参考像 std::vector::operator[] 这样的函数——它不会改变 vector 对象的成员,但仍然提供非 const 版本(和不同的 const 版本)。

看待这个问题的一个好方法是:假设您有一个 BufferObject,并将它传递给一个接受 const BufferObject& 的函数。如果该函数调用 dataStore(),它会扰乱您的期望(您期望保持的不变量)吗?如果是这样,请不要将 dataStore() 标记为 const

为了解决您的特殊情况,我认为您是正确的,应该将这些功能保留为非 const。虽然它们不修改 C++ 对象的物理内容,但它们 修改了由该 C++ 对象表示的实体的逻辑状态。