मुझे पता है कि =default
के रूप में चिह्नित एक कन्स्ट्रक्टर noexcept
होने पर "कोशिश करें" होगा। हालांकि, अगर मैं इसे बाहर वर्ग को परिभाषित, यह noexcept
अब और नहीं है, जैसा कि आप इस कोड से देख सकते हैं:क्लास के बाहर परिभाषित डिफ़ॉल्ट कन्स्ट्रक्टर कैसे बनाया जाए?
#include <iostream>
#include <utility>
#include <type_traits>
struct Bar
{
Bar() = default;
Bar(Bar&&) = default; // noexcept
};
struct Foo
{
Foo() = default;
Foo(Foo&&);
};
// moving the definition outside makes it noexcept(false)
Foo::Foo(Foo&&) = default; // not noexcept anymore
int main()
{
Foo foo;
Bar bar;
std::cout << std::boolalpha;
// checks
std::cout << std::is_nothrow_move_constructible<Bar>::value << std::endl;
std::cout << std::is_nothrow_move_constructible<Foo>::value << std::endl;
}
मैं कैसे एक वर्ग के बाहर इस तरह के एक =default
निर्माता परिभाषित कर सकते हैं और यह noexcept
बनाते हैं? और कक्षा के बाहर परिभाषित किए गए ऐसे निर्माता noexcept(false)
क्यों हैं? स्मार्ट पॉइंटर्स के माध्यम से PIMPL लागू करते समय यह समस्या उत्पन्न होती है।
विशेष रूप से, अगर यह अपनी प्रारंभिक घोषणा के बाद चूक है, सामान्यिंग एक अलग टीयू में, हो सकता है तो एक टीयू है जो सिर्फ क्लास परिभाषा में शामिल है में, संकलक जानने का कोई तरीका नहीं है कि समारोह होगा डिफॉल्ट हो। –
@ टी.सी. यह सही समझ में आता है, अब मैं समझता हूं। – vsoftco