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
答案 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 )
条件是以下之一:
我们在这里使用第二个项目符号,所以
您必须使用=
的语法:
if (SimpleLock::Token t = SimpleLock::Token(lock))
{
//...
}
或使用{}
(而非()
)
if (SimpleLock::Token t{lock})
{
//...
}