本文介绍了在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))
{
// ...
}
编译器错误:
在线代码链接:
解决方案它不会编译,因为这种形式的初始化不允许在
if
condition。
您可以使用复制初始化表单或braced-init-list:
if(SimpleLock :: Token t = SimpleLock :: Token(lock))
{
// .. 。
}
if(SimpleLock :: Token t {lock})
{
// ...
}
这在
[stmt.select] / 1
(N3337) :
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:
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):
这篇关于在if语句中声明类变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!