विज़ुअल सी ++ कंपाइलर bool
पर रूपांतरण के बारे में चेतावनी देता है, लेकिन एक मूर्ख प्रदर्शन चेतावनी के साथ। आम तौर पर यह एक अवांछित चेतावनी है, लेकिन दुर्भाग्य से इसे एक साधारण कलाकार के साथ चुप नहीं किया जा सकता है। इसे शांत करने के लिए लगभग मुहावरे एक डबल अस्वीकृति का उपयोग करना है, !!
, बैंग-बैंग, उदा। return !!0.0
।
आपकी समस्या विपरीत है, कि आप ऐसी चेतावनी या त्रुटि चाहते हैं, लेकिन फिर भी बैंग-बैंग लगभग-मुहावरे समाधान का हिस्सा हो सकता है।
विचार नीचे एक उदाहरण प्रस्तुत किया साथ
, तो आप बस bool
जहां एक बूलियन चाहते के बजाय Bool
लिखते हैं, और !!
का उपयोग स्वच्छ bool
मान यह सुनिश्चित करने, वरना आप संकलन त्रुटियों मिलता है।
इस बारे में अच्छी बात यह है कि संभवतः आप केवलके साथ bool
को बदलकर, अपने कोड में वैश्विक खोज कर सकते हैं और प्रतिस्थापित कर सकते हैं।
#ifdef CLEAN
# define TO_BOOL !!
#else
# define TO_BOOL
#endif
#define STATIC_ASSERT(e) static_assert(e, #e)
#include <type_traits> // std::is_same
#include <utility> // std::enable_if_t
class Bool
{
private:
bool value_;
public:
operator bool() const { return value_; }
template< class T
, class Enabled_ = std::enable_if_t<std::is_same<T,bool>::value, void>
>
auto operator=(T const other)
-> Bool&
{ value_ = other; return *this; }
Bool(): value_() {}
template< class T
, class Enabled_ = std::enable_if_t<std::is_same<T,bool>::value, void>
>
Bool(T const value)
: value_(value)
{}
};
auto f()
-> double
{ return 0.0; }
auto something()
-> Bool
{ return TO_BOOL 0.0; } // ← Line 43
auto g()
-> double
{
Bool x = TO_BOOL 0.0; // ← Line 48
if (something()) {
x = TO_BOOL f(); // where f() is a function returning a double
}
return x;
}
auto main() -> int
{
Bool a, b, c;
return a && b || something();
}
जी के साथ ++ उदाहरण संकलन:
c:\my\forums\so\105> g++ foo.cpp
foo.cpp: In function 'Bool something()':
foo.cpp:43:22: error: could not convert '0.0' from 'double' to 'Bool'
{ return TO_BOOL 0.0; } // ← Line 43
^
foo.cpp: In function 'double g()':
foo.cpp:48:25: error: conversion from 'double' to non-scalar type 'Bool' requested
Bool x = TO_BOOL 0.0; // ← Line 48
^
foo.cpp:50:13: error: no match for 'operator=' (operand types are 'Bool' and 'double')
x = TO_BOOL f(); // where f() is a function returning a double
^
foo.cpp:23:14: note: candidate: template<class T, class Enabled_> Bool& Bool::operator=(T)
auto operator=(T const other)
^
foo.cpp:23:14: note: template argument deduction/substitution failed:
foo.cpp:12:11: note: candidate: Bool& Bool::operator=(const Bool&)
class Bool
^
foo.cpp:12:11: note: no known conversion for argument 1 from 'double' to 'const Bool&'
foo.cpp:12:11: note: candidate: Bool& Bool::operator=(Bool&&)
foo.cpp:12:11: note: no known conversion for argument 1 from 'double' to 'Bool&&'
foo.cpp: In function 'int main()':
foo.cpp:58:18: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
return a && b || something();
^
c:\my\forums\so\105> g++ foo.cpp -D CLEAN
foo.cpp: In function 'int main()':
foo.cpp:58:18: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
return a && b || something();
^
c:\my\forums\so\105> g++ foo.cpp -D CLEAN -Wno-parentheses
c:\my\forums\so\105> _
आप कुछ अन्य प्रकार की तुलना में bool
विचार नहीं किया जा करने के लिए करने के लिए Bool
से अंतर्निहित रूपांतरण चाहते हैं, बस भी है कि रूपांतरण ऑपरेटर एक जाँच टेम्पलेट बनाने के लिए, निर्माता की तरह और असाइनमेंट ऑपरेटर।
क्या आपने '-pedantic-त्रुटियों 'की कोशिश की है? –
मैंने अभी कोशिश की: g ++ -Wall -Wextra -pedantic-error -c dummy.cpp और मुझे अभी भी चेतावनियां नहीं हैं। – Renaud
एमएसवीसी 14 इस के लिए [सी 4800] (https://msdn.microsoft.com/en-us/library/b6801kcy.aspx) उत्पन्न करता है। – wally