निम्नलिखित उदाहरण में, फ़ंक्शन तर्कों का उपयोग आवश्यक अभिव्यक्ति के साथ परीक्षण करने के लिए किया जाता है कि क्या उनका उपयोग करने वाला एक अभिव्यक्ति अच्छी तरह से बनता है। अभिव्यक्ति के लिए कोई तर्क नहीं चाहिए; यह सीधे कार्यक्षेत्र में चर का उपयोग करता है:
#include <cstddef>
#include <vector>
template<typename T>
void Resize(T &v, std::size_t const n)
{
if constexpr (requires { v.resize(n); })
v.resize(n);
}
template<typename T>
void Eziser(T &v, std::size_t const n)
{
if constexpr (requires { v.eziser(n); })
v.eziser(n);
}
int main()
{
std::vector<int> v;
Resize(v, 10u);
Eziser(v, 10u);
}
उपरोक्त कोड क्लैंग कॉन्सेप्ट्स शाखा के साथ संकलित है। हालाँकि, GCC10 केवल कॉल को स्वीकार करता है Resize
। GCC9 ICEs। क्या क्लैंग इसे स्वीकार करना सही है?
Resize
और Eziser
होना चाहिए अस्वीकार) या दोनों समारोह संकलन चाहिए। मैं कहूंगा कि क्लैंग सही है।