在if语句中声明类变量

时间:2016-02-15 13:33:26

标签: c++ class variables if-statement

c ++接受:

if(int a=1)
{
    //...
}

出于学习目的,我编写了一个简单的锁机制类:

class SimpleLock
{
public:
    class Token
    {
    public:
        friend class SimpleLock;
        Token(SimpleLock & lock) : lock(lock), locked(!lock.locked.exchange(true)) { }
        ~Token() { if(locked) lock.locked.store(false); }
        operator bool() const { return locked; }

    private:
        SimpleLock & lock;
        const bool locked;
    };

    SimpleLock() : locked(false) { }

private:
    std::atomic_bool locked;
};

允许我这样做:

SimpleLock::Token t(lock);

if(t) //Token has an operator bool() overload
{
    //...
}

为什么不进行以下编译?

if(SimpleLock::Token t(lock))
{
    //...
}

编译错误:

  

在&#39; <&#39;

之前预期的主要表达

在线代码链接:http://goo.gl/Knrmw7

2 个答案:

答案 0 :(得分:10)

它没有编译,因为在if条件下不允许这种形式的初始化。这仅仅是标准所说的有效的句法形式。

您可以使用复制初始化表单或braced-init-list:

if(SimpleLock::Token t = SimpleLock::Token(lock))
{
    //...
}

if(SimpleLock::Token t{lock})
{
    //...
}

这在[stmt.select]/1(N3337)中指定:

  

条件:

     
      
  • 表达

  •   
  • attribute-specifier-seq opt decl-specifier-seq declarator = initializer-clause

  •   
  • attribute-specifier-seq opt decl-specifier-seq declarator braced-init-list

  •   

答案 1 :(得分:3)

来自http://en.cppreference.com/w/cpp/language/if

语法为if ( condition )

条件是以下之一:

  • 表达式,可在上下文中转换为bool
  • 使用大括号或等号初始化程序声明单个非数组变量。

我们在这里使用第二个项目符号,所以

您必须使用=的语法:

if (SimpleLock::Token t = SimpleLock::Token(lock))
{
    //...
}

Demo

或使用{}(而非()

构建您的对象
if (SimpleLock::Token t{lock})
{
    //...
}

Demo