का __constructible विशेषता C++ 17 पर स्विच करते समय मानकसमाधान को प्रतिस्थापित करते समय क्लैंग 5 का वास्तव में अजीब और अप्रत्याशित व्यवहार पता चला था। कुछ कारणों से, emplace()
पैरामीटर वर्ग की std::is_constructible
विशेषता के दोषपूर्ण मूल्यांकन के कारण अक्षम किया जा रहा था।क्लैंग 5: std :: वैकल्पिक तात्कालिकता शिकंजा std :: पैरामीटर प्रकार
कुछ विशिष्ट पूर्व शर्त से पहले ही reproduces संतुष्ट किया जाना चाहिए:
#include <optional>
/// Precondition #1: T must be a nested struct
struct Foo
{
struct Victim
{
/// Precondition #2: T must have an aggregate-initializer
/// for one of its members
std::size_t value{0};
};
/// Precondition #3: std::optional<T> must be instantiated in this scope
std::optional<Victim> victim;
bool foo()
{
std::optional<Victim> foo;
// An error
foo.emplace();
/// Assertion is failed
static_assert(std::is_constructible<Victim>::value);
}
};
लाइव उदाहरण पर godbolt.org
बदलें किसी भी पूर्व शर्त की और उम्मीद के रूप में यह संकलित करता है। क्या मानक में कुछ अज्ञात असंगतता है जो अनुपालन करते समय इस कोड को अस्वीकार कर देता है?
एक तरफ ध्यान दें के रूप में: जीसीसी 7.1 और जीसीसी 7.2 ऊपर कोड के साथ कोई समस्या नहीं है।
बग रिपोर्ट पर: bugs.llvm.org
बहुत अच्छी तरह से एक संकलक बग हो सकता है। –
@ क्रिसलुएंगो, मुझे उम्मीद है, क्योंकि मानक से ठीक करना आसान है। – GreenScape
इसके मूल में, आपका एक भाषा वकील प्रश्न है, वास्तव में। इसका उत्तर दिया जाना चाहिए। – StoryTeller