如果您查看*declarator*s in §8/4
的语法,您会注意到 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';
}
但当声明中没有涉及指针(对数组或函数)时,允许这些括号的目的是什么?
答案 0 :(得分: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à!
};
}
答案 1 :(得分:4)
你问错了问题。正确的问题是:
取消此类声明的目的是什么?
答案是:没有。
所以,鉴于这种语法被允许作为其他地方的规则的副作用,这就是你得到的。