加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在if语句中声明类变量

发布时间:2020-12-16 10:36:13 所属栏目:百科 来源:网络整理
导读: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)
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))
{
    //...
}

编译错误:

expected primary-expression before ‘t’

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

解决方法

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

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

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

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

这在[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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读