声明如int(x)的目的是什么?或int(x)= 10;

Mao*_*Mao 38 c++ variable-declaration language-lawyer c++11

如果您查看语法,*declarator*s in §8/4您会注意到a noptr-declarator可以写成(ptr-declarator),也就是说,它可以写成(declarator-id),它可以验证标题中的声明.事实上,这段代码编译没有问题:

#include <iostream>
struct A{ int i;};
int (x) = 100;
A (a) = {2};
int main()
{
    std::cout << x << '\n';
    std::cout << a.i << '\n';
}
Run Code Online (Sandbox Code Playgroud)

但是当声明中没有涉及指针(数组或函数)时允许这些括号的目的是什么

Col*_*mbo 52

这条规则适用于您的情况这一事实并非故意:这最终是保持语法简单的结果.没有动机禁止像你这样的声明,但是有很大的抑制因素使规则复杂化,特别是如果这些规则错综复杂的话.

简而言之,如果您不想使用这种不必要的混淆语法,请不要这样做.
C++很少强迫您编写可读代码.

令人惊讶的是,有些情况下括号可以节省一天,但是:

std::string foo();

namespace detail
{
    int foo(long); // Another foo

    struct Bar
    {
        friend std::string ::foo(); // Doesn't compile for obvious reasons.

        friend std::string (::foo)(); // Voilà!
    };
}
Run Code Online (Sandbox Code Playgroud)

  • @DmitryFucintv:声明要声明在第一行声明的`foo`实例是struct`Bar`的`friend`.要将函数声明为friend,您需要提供其返回类型和参数.但是说'friend std :: string foo()`将不起作用,因为对于不合格的使用,'foo`被'另一个'`foo`隐藏.所以必须通过全局限定符`::`来限定`foo`.但是这会显示第一个表单,它会因指定`std :: string`的(不存在的)成员而产生歧义.`:: foo`周围的一对括号用于避免歧义 (4认同)