是否可以在某个范围内使变量无法访问?

时间:2016-10-23 14:14:33

标签: c++ scope

有没有办法禁用对特定范围内变量的所有访问?

它的用法可能类似于: -

int outerOnly=5; //primitive or class or struct, it can also be a field
outerOnly=4;  //ok
{//vvv The disable command may be in a block?
    disable outerOnly; //<--- I want some thing like this.
    outerOnly=4; //should compile error (may be assert fail?)
    int c=outerOnly;  //should compile error
}
outerOnly=4;  //ok

如果答案为否,是否有任何最接近此功能的功能?

在一些调试情况下会很有用 编辑:例如,我确信某个范围(也是一个独特的功能)永远不应该访问单个特定变量。

4 个答案:

答案 0 :(得分:6)

考虑实现类似的东西(可能包含已删除的复制构造函数和赋值运算符):

struct disable
{
private:
    disable(const disable&) = delete;
    disable& operator=(const disable&) = delete;
public:
    disable() {}
};

然后,放置

disable outerOnly;
内部范围内的

会导致所需的错误。

请记住,正如 @Cornstalks 所评论的那样,它可能会导致与阴影相关的编译器警告(反过来,通常可以根据具体情况禁用)。

答案 1 :(得分:2)

  

有没有办法禁用对特定范围内变量的所有访问?

不,没有这样的功能。

  

如果答案为否,是否有任何最接近此功能的功能?

您可以定义并调用不捕获不需要的变量的闭包,而不是简单的块:

int outerOnly;
int innerToo;
[&innerToo]()
{
    innerToo  = 42;        // ok
    outerOnly = 4;         // fails to compile
    int c     = outerOnly; // fails to compile
}();

答案 2 :(得分:1)

只需执行struct Outeronly;

请注意,如果不熟悉错误消息,则错误消息可能会令人困惑。

答案 3 :(得分:1)

这是非常直接的解决方案:

int main()
{
        int outerOnly=5; //primitive or class or struct, it can also be a field
        outerOnly=4;  //ok
        #define outerOnly outerOnly_disabled
        //outerOnly=4; //error outerOnly_disabled is not declared
        //int c=outerOnly;  //error 
        #undef outerOnly

        outerOnly=4;  //ok
}