According to cppreference.com, std :: वेक्टर :: क़ायम करना() मजबूत अपवाद गारंटी प्रदान करता है बिना शर्त: एक अपवाद फेंक दिया हैक्या std :: vector :: emplace() वास्तव में फेंकने वाले चालक/असाइनमेंट ऑपरेटर के चेहरे में मजबूत अपवाद गारंटी प्रदान करता है?
हैं (निर्माता द्वारा जैसे), कंटेनर असंशोधित छोड़ दिया है, इस समारोह के रूप में करता है, तो कभी नहीं था कहा जाता है (मजबूत अपवाद गारंटी)।
हालांकि, यह जीसीसी 7.1.1 के साथ अभ्यास में मामला प्रतीत नहीं होता है। निम्नलिखित कार्यक्रम:
#include <iostream>
#include <vector>
struct ugly
{
int i;
ugly(int i) : i{i} { }
ugly(const ugly& other) = default;
ugly& operator=(ugly&& other) {
if (other.i == 3) {
throw other.i;
}
i = other.i;
return *this;
}
ugly& operator=(const ugly& other) = default;
};
int main() {
std::vector<ugly> vec;
vec.reserve(6);
vec.emplace_back(0);
vec.emplace_back(1);
vec.emplace_back(2);
vec.emplace_back(4);
vec.emplace_back(5);
try {
vec.emplace(vec.begin() + 3, 3);
} catch (int i) {
}
for (const auto& u : vec) {
std::cout << u.i << "\n";
}
return 0;
}
प्रिंट
0 1 2 4 4 5
वास्तव में, मैं एक कठिन समय को देखकर कैसे क़ायम करना() संभवतः मजबूत गारंटी प्रदान कर सके नकल/चलती फेंकने के लिए अनुमति दी है अगर है । बीच में जाने के लिए, हमें पहले रास्ते से तत्वों का एक गुच्छा ले जाना है, फिर इसके स्थान पर नया तत्व बनाएं। अगर इनमें से कोई भी फेंकता है, तो हमें उन सभी अन्य तत्वों को वापस ले जाना होगा जहां वे थे, लेकिन वे चाल भी फेंक सकते हैं!
तो कौन गलत है, cppreference या gcc?
mispoting cppreference misquoting के लिए डाउनवोट। आपके द्वारा उद्धृत गारंटी 'emplace_back' के लिए है और (क्षमा करें, सुधार) अतिरिक्त प्रतिबंधों के बाद है। –
@ArneVogel पृष्ठ [अपडेट किया गया] था (http://en.cppreference.com/mwiki/index.php?title=Template%3Acpp%2Fcontainer%2Femplace&diff=94452&oldid=75433) क्योंकि मैंने यह प्रश्न लिखा है –