मेरे पास एक समस्या है जो this एक के समान है।सशर्त नोएसेप्ट और अधिभार के साथ असंगतता
संक्षेप में, मेरे पास magic
विधि है, जो noexcept
है यदि कोई अन्य विधि noexcept
है।
अजीब बात यह है कि इस "एक और तरीका" दो भार के है, और संकलक दूसराmagic
noexcept
-नेस निर्धारित करने के लिए अधिभार चुनता है।
हालांकि, जब magic
पर बाद में कहा जाता है, पहले अधिभार कहा जाता है, लेकिन magic
की noexcept
-नेस ही रहता है!
यहाँ मैं क्या समझ से wandbox link
है:
noexcept(magic(dummy2{}))
कॉलnoexcept(noexcept(adl_caller(...))
जो वापसadl_caller(..., priority_tag<0>) noexcept
पर गिर जाता हैuser_method(dummy2)
के बाद से इस बिंदु पर संकलक द्वारा ज्ञात नहीं है।
पर्याप्त मेला, हालांकि, user_method(dummy2)
को ऊपर 3 पंक्तियों को कैसे कहा जाता है? क्या यह मानक द्वारा लक्षित है?
क्षमा करें अगर मैं पर्याप्त स्पष्ट नहीं हूं।
#include <iostream>
template <unsigned N> struct priority_tag : priority_tag<N - 1> {};
template <> struct priority_tag<0> {};
template <typename T>
auto adl_caller(T t, priority_tag<1>) noexcept(noexcept(user_method(t)))
-> decltype(user_method(t)) {
std::cout << "first adl_caller overload" << std::endl;
user_method(t);
}
// tricky noexcept ...
template <typename T> void adl_caller(T, priority_tag<0>) noexcept {
std::cout << "second adl_caller overload" << std::endl;
}
template <typename T>
void magic(T t) noexcept(noexcept(adl_caller(t, priority_tag<1>{}))) {
adl_caller(t, priority_tag<1>{});
}
struct dummy {};
struct dummy2 {};
// un-commenting this line makes the above call to cout print '0'
// void user_method(dummy2);
void user_method(dummy)
{
// user_method(dummy2) is declared after this point
// this line prints '1', since magic falls back to the second adl_caller overload
std::cout << "noexcept?: " << noexcept(magic(dummy2{})) << std::endl;
std::cout << "dummy method called" << std::endl;
// however, the first adl_caller overload is called here ...
magic(dummy2{});
}
void user_method(dummy2)
{
std::cout << "dummy2 method called" << std::endl;
}
int main()
{
magic(dummy{});
}
मुझे लगता है कि मैं उन पैराग्राफ के कुछ हिस्सों को समझता हूं, लेकिन वे मेरे लिए थोड़ा अस्पष्ट हैं। मेरे पास केवल एक टीयू है और मेरे उदाहरण में कोई बाहरी संबंध कार्य नहीं है, मेरे द्वारा लिंक किए गए कोड से संबंधित अंतिम पैराग्राफ कैसा है? अगर मैं सही ढंग से समझता हूं, तो 'जादू' विधि पहले पैराग्राफ से जुड़ा हुआ है, लेकिन मुझे सटीक कारण समझने में कुछ परेशानी है। हालांकि मानक अंश के लिए बहुत बहुत धन्यवाद – Dante