c++ - कंस्ट्रक्टर में इंप्लिमेंट कनवर्ज़न से बचना स्पष्ट खोजशब्द यहाँ मदद नहीं करता है




c++11 (4)

Int-> डबल रूपांतरण से बचने के लिए हर जगह न केवल आपके मामले में, जी ++ के साथ-आप उपयोग कर सकते हैं -Wconversion -Werror । ध्यान दें कि इसे आपके विशेष मामले में अनुमति दी जाएगी क्योंकि संकलक समझते हैं कि 10.0 शाब्दिक है, लेकिन इसके लिए संकलन विफल हो जाएगा

 class A { public : explicit A(int a) { num = a; } int num; }; int main() { double x = 10; A a1=A(x); static_cast<void>(a1); return 0; } 

संकलक खोजकर्ता

मैं explicit कीवर्ड का उपयोग करके कंस्ट्रक्टर के निहित रूपांतरण से बचने में सक्षम हूं। तो अब, A a1 = 10; जैसे रूपांतरण A a1 = 10; क्या नजर अंदाज किया जा सकता है।

लेकिन फिर भी मैं A a1 = A(20.2); को इनिशियलाइज़ कर सकता हूं A a1 = A(20.2); । मैं ऑब्जेक्ट निर्माण को कैसे अक्षम कर सकता हूं कि केवल ऑब्जेक्ट बनाया जा सकता है यदि हम पूर्णांक को एक पैरामीटर जैसे कि A a1 = A(10) ?

#include <iostream>

class A
{
public :
    explicit A(int a)
    {
     num = a;
    }

    int num;
};

int main()
{
    A a1=A(10.0);
    std::cout << a1.num;
    return 0;
}

आप A::A(<anything not an int>); delete सकते हैं A::A(<anything not an int>); :

struct A
{
    explicit A(int a)
    : num(a)
    {}

    template<class T>
    A(T) = delete;

    int num;
};

int main()
{
    //A a1=A(10.0); // error: use of deleted function 'A::A(T) [with T = double]'
    A a2 = A(10); // OK
    (void) a2;
}

डेमो: https://coliru.stacked-crooked.com/a/425afc19003697c9


मैं सिर्फ यह जोड़ना चाहता हूं कि A(double) = delete C++11 जोड़ है।

यदि किसी कारण से आप इस अपेक्षाकृत नए निर्माण का उपयोग नहीं कर सकते हैं, तो आप बस इसे इस रूप में निजी घोषित कर सकते हैं:

class A{
  public:
    A(int);
  private:
    A(double);
}

स्पष्ट रूप से double लिए कंस्ट्रक्टर को हटा दें (संभवतः float जोड़ें):

A(double) = delete;




c++11