[英]c++ error; how should i interpret its meaning?
這可能是一個愚蠢的事情要問,但我很困惑與編譯錯誤,而試圖在閱讀使用安全布爾成語此文章。 以下是我的代碼,並指出了在main()函數中出現錯誤的行。
// is OK case
class BoolVer_OK {
bool m_OK;
public:
BoolVer_OK(bool ok) : m_OK(ok){}
operator bool() { return m_OK; }
};
// Not OK Case
class BoolVer_NotOK {
bool m_notOK;
public:
BoolVer_NotOK(bool ok) : m_notOK(!ok){}
bool operator !() const{ reportexecution; return !m_notOK; }
};
main()
{
BoolVer_OK ok(true);
BoolVer_NotOK notOK(true);
ok<<1; // Line#1 is valid
notOK << 1; // Line#2: error: inavlid operand to binary expression ('BoolVer_notOK' and 'int')
return 0;
}
為什么我們在#Line2上卻沒有在#Line1上出錯。 兩者均導致<<
運算符之前的布爾值。
ok
支持operator bool
,並且C ++具有此出色的功能,稱為隱式轉換和提升。在這種情況下,對於二進制移位運算符<<
, bool
值被提升為int
,然后將其移位1。
在第二種情況下,您沒有提供該運算符,因此沒有任何隱式轉換(和提升)為int的操作,並且您會得到錯誤。 嘗試在!notOk
前致電!notOk
,現在有一個布爾值,它將被提升。
我認為編譯器不會自動插入對operator!
的調用operator!
然后取而代之,以獲取所需的bool
。 根據我在您提供的鏈接中看到的內容,他們在兩次否定的情況下進行測試!!
。
ok<<1; // Line#1 is valid
notOK << 1; // Line#2: error: inavlid operand to binary expression ('BoolVer_notOK' and 'int')
發生這種情況是因為ok被隱式轉換為bool
(重載運算符),而notOK沒有該運算符。
測試以下代碼:
BoolVer_OK ok(true);
BoolVer_NotOK notOK(true);
int z = ok<<1; // is valid
//notOK << 1; // error: inavlid operand to binary expression ('BoolVer_notOK' and 'int')
int x = false << 1;
return 0;
移位運算符左側的布爾值將轉換為int,然后進行移位。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.