在if语句中声明类变量 [英] Declaring class variable inside an if statement
问题描述
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屋!