代码之家  ›  专栏  ›  技术社区  ›  Thor

用两种类型声明变量:“int char”

  •  79
  • Thor  · 技术社区  · 6 年前

    我是C++初学者,我在阅读 Bjarne Stroustrup编程:C++原理与实践 是的。

    在关于 3.9.2不安全转换 ,作者提到

    当初始值设定项是整数文本时,编译器可以检查实际值并接受不意味着缩小范围的值:

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

    我对这个声明感到困惑。它使用两种类型( int char )中。我以前从未在java和swift(我比较熟悉的两种语言)中见过这样的声明。这是一个拼写错误还是一个有效的C++语法?

    4 回复  |  直到 6 年前
        1
  •  94
  •   StoryTeller - Unslander Monica    6 年前

    这是本书中的一个错误。这不是一个有效的C++声明,即使没有假定的缩小转换。

    上的任何勘误表都没有提到 Bjarne Stroustrup's page (第四次印刷和更早),不过,这是奇怪的。这显然是个错误。我想既然有人评论 //error 很少有人注意到声明本身的错误。

        2
  •  23
  •   Bathsheba    6 年前

    这本书错了。

    令牌序列 int char b1{1000}; 在语义上不是有效的C++。

    你想申报 b1 不止一种类型,这毫无意义。

        3
  •  10
  •   Alex    6 年前

    这是错误的。 在C/C++中,多类型声明可以通过使用联盟来实现。如:

    union {
        int i;
        char c;
    } var;
    
    var.i = 42;
    /* OR */
    var.c = ‘c’;
    

    存储是相同的,所以.c和.i只是同一个值的每个类型句柄。

        4
  •  6
  •   P.W    6 年前

    这在C/C++语法中是错误的。除了 union S(参见@亚历克斯回答),有一种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
    }