C++变量声明语法

7
我最近发现了这个结构: int(m); 它似乎等同于: int m;
奇怪的是,我以前从未见过这种特定的惯用法。有人能指点我一个参考资料吗?或者直接解释一下?这在纯C中也适用吗?
谢谢, 困惑的开发者

3
虽然这是声明整数的合法语法,但为了方便其他开发者,请将其更改为 int m; - Zac Howland
3个回答

11

这不是一种“惯用语”。它只是一对多余的括号。从语法角度来看,它们可以存在,但它们没有任何作用。

有时候,在 C++ 声明中使用类似的冗余括号可以解决歧义问题,例如:

int a(int());

可以将声明为可转换为函数的函数

int a((int()));

等同于

int a = int();

并且定义一个变量。但这并不完全符合您的情况。


2
小细节:它并不总是多余的。例如,你可以写成 cout << int(n),但不能写成 cout << int n - suszterpatt
谢谢,这很有帮助。顺便说一下,成语的定义是:一种被使用认可的表达方式,是某种语言所特有的。看起来这是一个合适的描述。 - ConfusedDeveloper
7
问题特别涉及到声明。你的例子根本没有涉及任何声明。你的例子是关于表达式中的(),这是完全不同的问题。 - AnT stands with Russia

1

它也用于类型转换。比如,

double m= 10.0;
int n= int(m);

这个问题涉及到声明,而这根本不是一个声明,只是看起来类似而已。 - aschepler
2
@aschepler:是的。因为看起来很相似,所以我才发帖。只是想告诉他这也是它的用法。 :-) - Nawaz

1
除了其他答案外,有时候声明符必须加上括号。
例如:
struct A {};

struct B { A a; };

namespace N {
  struct B { int a; };

  void f()
  {
    A (::B::*p) = &::B::a; // this () cannot be omitted
  }
}

如果在上述代码中省略了(),编译器会将连续嵌套的名称限定符A::B识别为A::B,并发出错误提示。
这个括号是必要的,但有时会导致误解的情况。
struct A {
  int m;
  A() {}
  A( int ) {} // this isn't called
};

int i;

int main()
{
  A(i); // this is a declaration
  i.m = 1; // ok
}

在上述代码中,A(i) 是一个对象 i 的声明(在这种情况下也是定义),而不是带有 int 参数 i 的构造函数调用表达式。
希望这可以帮助到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接