2016-10-07 2 views
6

मैं जीसीसी 7 पाया गारंटी प्रतिलिपि इलिजन लागू किया गया है, और मैं wandbox में नीचे दिए गए कोड की कोशिश की:गारंटी प्रतिलिपि इलिजन और Nonmoveable {Nonmoveable {}}

#include <iostream> 

struct NonMovable 
{ 
    NonMovable() noexcept = default; 
    NonMovable(NonMovable&&) noexcept = delete; 
    NonMovable& operator=(NonMovable&&) noexcept = delete; 
}; 

NonMovable Make() 
{ 
    return {}; 
} 


int main() 
{ 
    //[[maybe_unused]] const auto x = Make(); 
    //const auto z = NonMovable{}; 
    [[maybe_unused]] const auto y = NonMovable{NonMovable{}}; 
} 

और मैं त्रुटि संकलन मिल गया:

prog.cc: In function 'int main()': 
prog.cc:20:60: error: use of deleted function 'NonMovable::NonMovable(NonMovable&&)' 
    [[maybe_unused]] const auto y = NonMovable{NonMovable{}}; 
                  ^
prog.cc:6:5: note: declared here 
    NonMovable(NonMovable&&) noexcept = delete; 
    ^~~~~~~~~~ 

cppreference के अनुसार:

In initialization, if the initializer expression is a prvalue and the cv-unqualified version of the source type is the same class as the class of the destination, the initializer expression is used to initialize the destination object:
T x = T(T(T())); // only one call to default constructor of T, to initialize x

तो मुझे लगता है यह होना चाहिए equ अल से const Movable y{};। क्या गलत है?

+0

ऐसा लगता है कि यह जीसीसी का एक बग है। कोड जीसीसी के नए निर्माण पर अच्छी तरह से संकलित करता है। – Cu2S

उत्तर

1

सूची-प्रारंभिकरण आपको क्या होता है पर कोई सटीक नियंत्रण नहीं देता है। असल में समिति ने अनुमान लगाया है कि प्रोग्रामर शायद सबसे अधिक क्या करना चाहता है और इसी अर्थ को सौंपा गया है।

यदि आप सटीक नियंत्रण चाहते हैं, तो गैर-सूची प्रारंभिकरण का उपयोग करें। इसके लिए, आपके टेस्टकेस निश्चित रूप से काम करना चाहिए।

आप सूची-प्रारंभ करने के लिए, समुच्चय के लिए तो रहना है, मैं, लगता है वर्तमान मसौदा शब्दों यह करते हैं और गारंटी प्रतिलिपि "इलिजन" लागू होता होगा, क्योंकि वे कहते हैं

If T is an aggregate class and the initializer list has a single element of type cv U, where U is T or a class derived from T, the object is initialized from that element (by copy-initialization for copy-list-initialization, or by direct-initialization for direct-list-initialization).

इसके अलावा, आप हो सकता है मानक के भविष्य में संशोधन या गैर-योग के लिए भी दोष रिपोर्ट रिज़ॉल्यूशन में आप जो चाहते हैं उसे प्राप्त करें। मेरा मानना ​​है कि आपकी कक्षा एक कुल है, इसलिए इसे संकलित करना चाहिए। लेकिन शायद कुछ ऐसा है जो मैं यहां लापता हूं।

+1

"गैर-सूची प्रारंभिकरण का उपयोग करें।" 'कॉन्स ऑटो वाई = गैर-प्रयोज्य (गैर-प्रयोज्य()) होगा; '? यदि ऐसा है, तो यह काम नहीं करता प्रतीत होता है। –

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