С ++ Синтаксис отклонения переменной - PullRequest
7 голосов
/ 18 января 2011

Я недавно наткнулся на эту конструкцию: Int (м); что, кажется, эквивалентно: int m;

Как ни странно, я никогда раньше не видел такой идиомы. Может кто-то указать мне ссылку, где я могу прочитать спецификацию по этому, или просто объяснить напрямую? Это также работает в прямой C?

Спасибо, ConfusedDeveloper

Ответы [ 3 ]

11 голосов
/ 18 января 2011

Это не "идиома". Это просто лишняя пара скобок. Грамматически они могут быть там, но они не служат цели.

Иногда подобные, казалось бы, лишние скобки можно использовать для устранения неоднозначности в объявлениях C ++, например

int a(int());

, который объявляет функцию, можно превратить в

int a((int()));

, что эквивалентно

int a = int();

и определяет переменную. Но это не совсем то, что у вас есть в вашем случае.

1 голос
/ 19 января 2011

В дополнение к другим ответам иногда декларатор должен быть заключен в скобки.
Например:

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.

Надеюсь, это поможет.

1 голос
/ 18 января 2011

Также используется для каста. Мол,

double m= 10.0;
int n= int(m);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...