考虑这个类

class Foo
{
public:
    Foo()
       : r_obj(&nullobj)
    {}

    void setDataRef(const T& obj)
    {
        r_obj = &obj;
    }

private:
    static T nullobj;
    const T* r_obj;
};

这会强制 r_obj 指向某个东西,我知道该类不能修改它指向的任何东西的逻辑状态。但是,现在将临时对象传递给 setDataRef 是完全合法的,这真的很糟糕。

如果改为使用 setDataRef(T&) ,则常量性将丢失。

传递指针不会强制对象真正指向某物。

是否有可能获得所有三个:
  • 稳定性
  • 非空
  • 禁止临时
  • 最佳答案

    在旧的 C++ 中,我认为这是不可能的,但是使用 C++11 我们可以做到:

    class Foo
    {
    public:
        Foo()
           : r_obj(&nullobj)
        {}
    
        void setDataRef(const T& obj)
        {
            r_obj = &obj;
        }
        void setDataRef(T&& obj) = delete;   // Crucial extra line
    
    private:
        static T nullobj;
        const T* r_obj;
    };
    

    如果有人试图将临时值传递给 setDataRef ,重载决议将更喜欢 T&& 版本,但由于它已被删除,因此调用格式错误。如果有人传递一个左值,它将绑定(bind)到 const 引用。

    关于c++ - 在保持常量性的同时强制非空,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34437126/

    10-11 16:55