2015-11-05 8 views
20

यह प्रोग्राम एमएसवीसी (वीएस 2015 तक) के साथ संकलित होने पर 1 2 के बजाय 1 1 प्रिंट करता है।एमएसवीसी में ओडीआर बग?

f1.cpp:

#include <functional> 

static std::function<int()> helper() { 
    struct F { int operator()() { return 1; } }; 
    return F(); 
} 

std::function<int()> f1() { return helper(); } 

f2.cpp:

#include <functional> 

static std::function<int()> helper() { 
    struct F { int operator()() { return 2; } }; 
    return F(); 
} 

std::function<int()> f2() { return helper(); } 

main.cpp:

#include <functional> 
#include <iostream> 

std::function<int()> f1(); 
std::function<int()> f2(); 

int main() { 
    std::cout << f1()() << " " << f2()() << "\n"; 
} 

यह रूप में अगर अलग F की परिभाषा ओडीआर तोड़ रही है। लेकिन स्थानीय वर्गों को अलग नहीं होना चाहिए? दिलचस्प बात यह है कि अगर हम लैम्ब्डा कार्यों के साथ F को प्रतिस्थापित करते हैं तो कोई संघर्ष नहीं होता है।

तो क्या यह एक कंपाइलर बग है या क्या मैं एक परिभाषा नियम को गलत समझ रहा हूं?

+0

बिट पागल कि MSVC यह गलत तरह कुछ हो जाता है के साथ खुश नहीं थे। यदि आप 'स्थिर' को हटाते हैं और एक अनाम नामस्थान का उपयोग करते हैं तो यह भी गलत हो जाता है। – Simple

+0

क्या होता है जब आप एक के बजाय दो अलग-अलग couts का उपयोग करते हैं? – cup

+1

क्या आप निश्चित हैं? एमएसवीसी 14.0 के साथ, अगर 'सहायक') को अनाम नामस्थान में रखा गया है तो संघर्ष दूर हो जाता है। –

उत्तर

1

यह एमएसवीसी में स्पष्ट रूप से एक बग है, क्योंकि सभी प्रकार अद्वितीय हैं। शायद कुछ फ़ंक्शन के अंदर परिभाषित structs के लिए (इस मामले में helper) एमएसवीसी आंतरिक रूप से उनसे व्यवहार करता है जैसे कि उन्हें helper::F के रूप में परिभाषित किया गया है, जबकि यदि सहायक स्थिर है तो इसे f1_cpp::helper::F की तरह कुछ करना चाहिए था। लिंक समय लिंकर के परिणामस्वरूप दो समान नामांकित इनलाइन फ़ंक्शंस देखता है और उन्हें एक में विलीन कर देता है।

अधिकांश इनपुट का क्रम बदल कर जाने की संभावना फ़ाइलें हैं उन्हें 2 2 प्राप्त कर सकते हैं अगर आप 1 1 :)

संबंधित मुद्दे