c++ - दो प्रकारों के साथ एक चर की घोषणा: "इंट चार"




type-conversion initialization (3)

किताब गलत है।

टोकन अनुक्रम int char b1{1000}; शब्दार्थ सी + + मान्य नहीं है।

आप एक से अधिक प्रकार के साथ b1 घोषित करने की कोशिश कर रहे हैं, जिसका कोई मतलब नहीं है।

मैं एक C ++ शुरुआती हूं, और Bjarne Stroustrup के प्रोग्रामिंग: सिद्धांत और अभ्यास C ++ का उपयोग कर रहा हूं।

3.9.2 असुरक्षित रूपांतरण पर अनुभाग में, लेखक ने उल्लेख किया

जब इनिशलाइज़र एक पूर्णांक शाब्दिक होता है, तो कंपाइलर वास्तविक मान की जाँच कर सकता है और उन मूल्यों को स्वीकार कर सकता है जो संकीर्ण नहीं होते हैं:

int char b1 {1000};     // error: narrowing (assuming 8-bit chars)

मैं इस घोषणा से हैरान हूं। यह दो प्रकार ( int और char ) का उपयोग करता है। मैंने जावा और स्विफ्ट में ऐसी घोषणा पहले कभी नहीं देखी थी (दो भाषाएँ जिनसे मैं अपेक्षाकृत परिचित हूँ)। क्या यह एक टाइपो या एक वैध C ++ सिंटैक्स है?


यह C / C ++ सिंटैक्स में गलत है। union एस (@ एलेक्स जवाब देखें) के अलावा, केवल उपलब्ध प्रकारों में से एक को संग्रहीत करने के लिए C ++ तरीका है जिसे std::variant (टाइप-सेफ यूनियन) कहा जाता है:

#include <variant>
#include <string>

int main()
{
    std::variant<int, float> v, w;
    v = 12; // v contains int
    int i = std::get<int>(v);
    w = std::get<int>(v);
    w = std::get<0>(v); // same effect as the previous line
    w = v; // same effect as the previous line

//  std::get<double>(v); // error: no double in [int, float]
//  std::get<3>(v);      // error: valid index values are 0 and 1

    try {
      std::get<float>(w); // w contains int, not float: will throw
    }
    catch (std::bad_variant_access&) {}

    std::variant<std::string> v("abc"); // converting constructors work when unambiguous
    v = "def"; // converting assignment also works when unambiguous
}

यह गलत है। C / C ++ में यूनियनों के उपयोग के माध्यम से बहु-प्रकार की घोषणाएं प्राप्त की जा सकती हैं। उदाहरण के लिए:

union {
    int i;
    char c;
} var;

var.i = 42;
/* OR */
var.c = c’;

भंडारण समान है, इसलिए .c और .i समान मूल्य के लिए केवल प्रति-प्रकार के हैंडल हैं।







narrowing