在if语句中声明类变量 [英] Declaring class variable inside an if statement

查看:248
本文介绍了在if语句中声明类变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

c ++接受:

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

为了学习的目的,我写了一个简单的锁机制类: p>

  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假); }
operator bool()const {return locked; }

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

SimpleLock():locked(false){}

private:
std :: atomic_bool locked;
};

允许我执行:

  SimpleLock :: Token t(lock); 

if(t)//令牌有一个运算符bool()overload
{
// ...
}



为什么不编译以下内容?

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

编译器错误:


't'之前的主表达式


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

解决方案

它不会编译,因为这种形式的初始化不允许在 if condition。



您可以使用复制初始化表单或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




c++ accepts:

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

For learning purposes, I have written a simple lock mechanism class:

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;
};

allowing me to do:

SimpleLock::Token t(lock);

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

Why doesn't the following compile?

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

Compiler error:

expected primary-expression before 't'

Online code link : http://goo.gl/Knrmw7

解决方案

It doesn't compile because that form of initialization is not allowed in an if condition. This is just down to the syntactic forms which the standard says are valid.

You can either use the copy-initialization form or a braced-init-list:

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

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

This is specified in [stmt.select]/1 (N3337):

condition:

  • expression

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

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

这篇关于在if语句中声明类变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆