Какой смысл g ++ -Wreorder?

Я лично использую немного сценарий Автогорячей клавиши , чтобы повторно отобразить определенные функции клавиатуры, для консоли (CMD) я использую:

; Redefine only when the active window is a console window 
#IfWinActive ahk_class ConsoleWindowClass

; Close Command Window with Ctrl+w
$^w::
WinGetTitle sTitle
If (InStr(sTitle, "-")=0) { 
    Send EXIT{Enter}
} else {
    Send ^w
}

return 


; Ctrl+up / Down to scroll command window back and forward
^Up::
Send {WheelUp}
return

^Down::
Send {WheelDown}
return


; Paste in command window
^V::
; Spanish menu (Editar->Pegar, I suppose English version is the same, Edit->Paste)
Send !{Space}ep
return

#IfWinActive 

139
задан Peeter Joot 1 December 2009 в 19:41
поделиться

4 ответа

Учтите:

struct A {
    int i;
    int j;
    A() : j(0), i(j) { }
};

Теперь i инициализируется некоторым неизвестным значением, а не нулем.

В качестве альтернативы, инициализация i может иметь некоторые побочные эффекты, для которых важен порядок. Например,

A(int n) : j(n++), i(n++) { }
236
ответ дан 23 November 2019 в 23:19
поделиться

Проблема в том, что кто-то может увидеть список инициализаторов членов в конструкторе и подумать, что они выполняются в таком порядке (сначала j, затем i). Это не так, они выполняются в том порядке, в котором члены определены в классе.

Предположим, вы написали A (): j (0), i (j) {} . Кто-то может прочитать это и подумать, что i заканчивается значением 0. Это не так, потому что вы инициализировали его с помощью j, который содержит мусор, потому что он сам не был инициализирован.

Предупреждение напоминает вам написать ] A (): i (j), j (0) {} , что, надеюсь, выглядит более подозрительно.

36
ответ дан 23 November 2019 в 23:19
поделиться

Это может вас укусить, если ваши инициализаторы имеют побочные эффекты. Примите во внимание:

int foo() {
    puts("foo");
    return 1;
}

int bar() {
    puts("bar");
    return 2;
}

struct baz {
    int x, y;
    baz() : y(foo()), x(bar()) {}
};

Выше будет напечатано «bar», затем «foo», хотя интуитивно можно было бы предположить, что порядок такой, как написано в списке инициализаторов.

В качестве альтернативы, if x и y относятся к определенному пользователем типу с конструктором, этот конструктор также может иметь побочные эффекты с тем же неочевидным результатом.

Он также может проявляться, когда инициализатор для одного члена ссылается на другой член.

9
ответ дан 23 November 2019 в 23:19
поделиться

Предупреждение существует, потому что если вы просто прочитаете конструктор, похоже, что j инициализируется до i . Это становится проблемой, если один используется для инициализации другого, как в

struct A {
  int i;
  int j;
  A(): j (0), i (this->j) { }
};

. Когда вы просто смотрите на конструктор, этот выглядит безопасным. Но на самом деле j еще не был инициализирован в точке, где он используется для инициализации i , и поэтому код не будет работать должным образом. Отсюда и предупреждение.

7
ответ дан 23 November 2019 в 23:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: