जीसीसी कुछ अभिव्यक्तियों को निरंतर मूल्यांकन करने में असमर्थ है। हालांकि क्लेंग इसके साथ अच्छा है।Constexpr: नलप्टर की तुलना - बग या सुविधा?
/*
*/
constexpr int foo(const int * array)
{
if (array == nullptr) // Error: '(((const int*)(& array)) == 0u)' is not a constant expression
{
return 0;
}
return 1;
}
constexpr int bar()
{
int array[100] = {};
return foo(array);
}
static_assert(bar() == 1, "outch..."); // Does not compile. See above.
static_assert(foo(nullptr) == 0, "okay");
constexpr int i[100] = {};
static_assert(foo(i) == 1, "okay");
भी काम नहीं करता:
constexpr int foobar()
{
int array[100] = {};
int *ar = array;
if (ar == nullptr) // Error...
{
return 0;
}
return 1;
}
static_assert(foobar() == 1, "okay");
यही बात:
constexpr int foo2()
{
int *a = nullptr;
if (a == nullptr) // Error...
{
return 0;
}
return 1;
}
static_assert(foo2() == 0, "okay");
मेरा मतलब है, nullptr
करने के लिए एक तुलना एक करने के लिए एक तुलना की तुलना में कुछ और ही होना चाहिए अन्य यादृच्छिक पता।
क्या आप कहेंगे: यह एक बग या व्याख्या का विषय है? मेरे लिए, दोनों कंपेलरों के लिए एक ही कोड लिखना मुश्किल है ...
यह त्रुटि जीसीसी 5.0 से 5.4 के लिए होती है। जीसीसी 6+ में केवल foobar()
संकलित नहीं करता है।