আমরা একটি ব্যবহার করতে চান, তখন static_assertএকটি if constexprআমরা শর্ত কিছু টেমপ্লেট প্যারামিটার উপর নির্ভরশীল করা আবশ্যক। মজার বিষয় হল, কোডটি যখন ল্যাম্বডায় মোড়ানো হয় তখন জিসিসি এবং কলঙ্কগুলি দ্বিমত হয়।
নিম্নলিখিত কোডটি জিসিসির সাথে সংকলন করে, তবে ঝনঝনানি দৃsert়তাটিকে ট্রিগার করে, এমনকি যদি এটি if constexprসত্য নাও হয়।
#include <utility>
template<typename T> constexpr std::false_type False;
template<typename T>
void foo() {
auto f = [](auto x) {
constexpr int val = decltype(x)::value;
if constexpr(val < 0) {
static_assert(False<T>, "AAA");
}
};
f(std::integral_constant<int, 1>{});
}
int main() {
foo<int>();
}
এটি সহজেই বিকল্প False<T>দ্বারা স্থির করা যেতে পারে False<decltype(x)>।
সুতরাং প্রশ্নটি: কোন সংকলকটি সঠিক? আমি ধরে নিয়েছিলাম যে সিসিটি সঠিক, কারণ অবস্থার static_assertউপর নির্ভরশীল T, তবে আমি নিশ্চিত নই।
static_assert(False<int>, "AAA");সমতুল্য static_assert(false, "AAA");।
f(std::integral_constant<int, 1>{});ওয়ানডবক্স যেখানে ওপি'র উদাহরণ ব্যবহার করা দৃsert়তাটিকে ট্রিগার করে না: ভ্যান্ডবক্স.অর্গ