为什么C++允许我们在声明变量时将变量名称括在括号中?
Why does C++ allow us to surround the variable name in parentheses when declaring a variable?
例如这样的声明:
int (x) = 0;
甚至:
int (((x))) = 0;
我偶然发现了这个,因为在我的代码中,我碰巧有一个类似于以下内容的片段:
struct B
{
};
struct C
{
C (B *) {}
void f () {};
};
int main()
{
B *y;
C (y);
}
显然,我想构造对象C
然后在其析构函数中做一些有用的事情。但是,碰巧编译器C (y);
视为类型为C
的变量y
声明,因此它会打印有关y
重新定义的错误。有趣的是,如果我将其编写为C (y).f ()
或类似C (static_cast<B*> (y))
,它将按预期编译。当然,最好的现代解决方法是在构造函数调用中使用{}
。
因此,正如我在那之后发现的那样,可以声明像int (x) = 0;
甚至int (((x))) = 0;
这样的变量,但我从未见过有人真正使用这样的声明。所以我很感兴趣 - 这种可能性的目的是什么,因为现在我看到它只创建了类似于臭名昭著的"最令人烦恼的解析"的情况,并没有添加任何有用的东西?
> 分组。
作为一个特定示例,请考虑您可以声明函数类型的变量,例如
int f(int);
现在,您将如何声明指向此类事物的指针?
int *f(int);
不,不行!这被解释为返回int*
的函数。您需要添加括号以使其以正确的方式解析:
int (*f)(int);
数组也是如此:
int *x[5]; // array of five int*
int (*x)[5]; // pointer to array of five int
通常允许在此类声明中使用括号,因为从语法的角度来看,声明总是如下所示:
<front type> <specification>;
例如,在以下声明中:
int* p[2];
"正面类型"是int
的(不是int*
),"规格"是* p[2]
的。
规则是,您可以根据需要在"规范"部分使用任意数量的括号,因为它们有时不可避免地要消除歧义。例如:
int* p[2]; // array of 2 pointers to int; same as int (*p[2]);
int (*p)[2]; // pointer to an array of 2 ints
指向数组的指针是罕见的情况,但是指向函数的指针的情况相同:
int (*func(int)); // declares a function returning int*
int (*func)(int); // declares a pointer to function returning int
这是对您的问题的直接回答。如果你的问题是关于像C(y)
这样的陈述,那么:
- 在整个表达式周围加上括号 -
(C(y))
,你会得到你想要的 - 此语句只创建一个临时对象,该对象在此指令结束后停止存在(我希望这是您打算做的)。
相关文章:
- 你能重载对象变量名本身返回的内容吗
- 在C/C++中将变量名定义为__00000001有什么好处吗
- C++变量名(可以将 main 声明为变量,但对于其他函数名称则不然)
- C++ - 声明中变量名后面的括号
- 如何使替换 c 函数的变量名成为错误?
- 是否可以创建没有变量名的变量
- fstream库,试图创建一个变量名为(c++)的文件
- 一个数组C++中的消息和变量名
- 在变量名后声明带有 () 的非内部类型与不使用变量名的行为不同。即 std::map<int,char>x(); - 这是怎么回事?
- 数组的变量名和该数组的地址有什么区别?
- 如何将变量名设置为字符串?C++
- 类中具有相同变量名的多重继承
- 如何在从.txt文件中读取时不重复相同的变量名
- 在循环中使用相同的变量名可以吗
- C++保留符号作为C变量名
- 在C++中,在给定的相同作用域内声明相同的变量名
- 为什么类名与"::"一起使用在变量名之前?
- 在同级之间继承相同的变量名
- __COUNTER__变量名中
- 按变量名遍历结构