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

C++中有关声明语法的技巧问题

  •  9
  • rmn  · 技术社区  · 15 年前

    看看这里: 在下面的代码中,B的类型是什么?

    struct A {
        A (int i) {}
    };
    
    struct B {
        B (A a) {}
    };
    
    int main () {
        int i = 1;
        B b(A(i)); // what would be the type of b
        return 0;
    }
    

    如果有人能彻底地向我解释为什么会存在这样的语法,我将不胜感激。

    谢谢。

    3 回复  |  直到 15 年前
        1
  •  7
  •   Omnifarious    15 年前

    C的一个缺点(C++继承了它(并且使它更糟))是没有特殊的语法来引入声明。这意味着声明通常看起来像可执行代码。另一个例子:

    A * a;
    

    这是将a乘以a,还是声明什么?为了理解这一行,您必须知道a是类型的名称。

    C++中的基本规则是,如果某事物可以被解析为一个声明,它就是。在这种情况下,它会导致一个奇怪而令人惊讶的结果。函数声明看起来很像函数调用,特别是(在a之后,可以用两种方式来考虑)。

    在这个示例中,您可以使用额外的括号来绕过这个问题,这样可以消除编译器将代码解析为声明的能力。

    B b((A(i)));
    

    在C中,这并不含糊,因为没有构造函数调用的函数样式,因为没有构造函数。a是类型的名称,或者是函数的名称。不能两者兼而有之。

        2
  •  7
  •   Kirill V. Lyadvinsky    15 年前

    它是根据C++标准82/1的局部函数声明。可以使用隐式的构造函数形式来避免这种情况或以下情况:

    B b(A(i)); // is equal to B b( A i );
    
    // ---
    
    // to declare variable of type B write:
    B b = A(i);
    // explicit form if you want:
    B b( static_cast<A>(A(i)) );
    // or
    B b( (A)i );
    

    C++标准82/1:

    由于函数样式转换与6.8中提到的声明之间的相似性而产生的模糊性 也可以出现在声明的上下文中。在该上下文中,可以在函数声明之间进行选择 参数名周围有一组多余的括号,函数样式的对象声明 转换为初始值设定项。正如6.8中提到的模棱两可一样,解决方案是考虑- 可能是声明或声明的结构。

        3
  •  5
  •   UncleBens    15 年前
    B b(A(i)); 
    

    等于

    B b(A i);
    

    -参数名周围的括号是可选的-相当于

    B b(A);
    

    -参数名称在函数声明中是可选的。因此,它是一个函数声明。

    通常你会碰到它

    X x();
    

    -不是预期的默认构造函数,但在一路使用临时构造函数时,会出现更复杂的情况,例如

    vector<int> v(istream_iterator<int>(cin), istream_iterator<int>());