当前位置:  开发笔记 > 编程语言 > 正文

强制非null,同时保留constness

如何解决《强制非null,同时保留constness》经验,为你挑选了1个好方法。

考虑这个课程

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&),则常量丢失.

传递指针不会强制对象真正指向某个东西.

是否可以获得所有三个:

常量性

非空

禁止临时

Martin Bonne.. 6

在旧的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&&版本,但因为它被删除,所以调用格式不正确.如果有人传递左值,那将绑定到const引用.



1> Martin Bonne..:

在旧的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&&版本,但因为它被删除,所以调用格式不正确.如果有人传递左值,那将绑定到const引用.


但要注意; 错误仍然存​​在.如果将对Foo对象的引用传递给函数,并将数据引用设置为函数内的局部变量,然后从函数返回 - 则引用将不再有效.
推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有