क्या संलग्नक दायरे के चर को "कैप्चर" करने की अनुमति है?


10

निम्नलिखित उदाहरण में, फ़ंक्शन तर्कों का उपयोग आवश्यक अभिव्यक्ति के साथ परीक्षण करने के लिए किया जाता है कि क्या उनका उपयोग करने वाला एक अभिव्यक्ति अच्छी तरह से बनता है। अभिव्यक्ति के लिए कोई तर्क नहीं चाहिए; यह सीधे कार्यक्षेत्र में चर का उपयोग करता है:

#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। क्या क्लैंग इसे स्वीकार करना सही है?


2
ICE हमेशा कंपाइलर इश्यू होता है।
11:42 पर Jarod42

(दोनों तो मैं कहूंगा कि अगर यह स्थानीय चर पर कब्जा करने के लिए अनुमति नहीं है कि या तो यह कोड अस्वीकार कर देना चाहिए Resizeऔर Eziserहोना चाहिए अस्वीकार) या दोनों समारोह संकलन चाहिए। मैं कहूंगा कि क्लैंग सही है।
11:42 पर Jarod42

@ Jarod42 हाँ। जीसीसी व्यवहार स्पष्ट रूप से छोटी गाड़ी है। मैं एक पीआर दर्ज करूँगा। मुझे यह भी लगता है कि क्लैंग सही है, लेकिन मैं पुष्टि करना चाहता हूं।
मेटलफॉक्स नोव

जवाबों:


6

हां, एक आवश्यकता-अभिव्यक्ति कुछ भी उपयोग कर सकती है जो कि गुंजाइश है। इसे नेस्टेड-आवश्यकता या अन्य स्थिर अभिव्यक्ति को छोड़कर, केवल इसके नाम के प्रकार की आवश्यकता होती है । यह आसपास के घोषणाओं का उतना ही सच है जितना कि इसके अपने (औपचारिक) मापदंडों का।

[expr.prim.req] / 5 :

आवश्यकता शरीर का एक क्रम होता है आवश्यकताओं । ये आवश्यकताएं स्थानीय पैरामीटर, टेम्पलेट पैरामीटर, और संलग्नक संदर्भ से दिखाई देने वाली किसी भी अन्य घोषणाओं को संदर्भित कर सकती हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.