Я лично использую немного сценарий Автогорячей клавиши , чтобы повторно отобразить определенные функции клавиатуры, для консоли (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
Учтите:
struct A {
int i;
int j;
A() : j(0), i(j) { }
};
Теперь i
инициализируется некоторым неизвестным значением, а не нулем.
В качестве альтернативы, инициализация i
может иметь некоторые побочные эффекты, для которых важен порядок. Например,
A(int n) : j(n++), i(n++) { }
Проблема в том, что кто-то может увидеть список инициализаторов членов в конструкторе и подумать, что они выполняются в таком порядке (сначала j, затем i). Это не так, они выполняются в том порядке, в котором члены определены в классе.
Предположим, вы написали A (): j (0), i (j) {}
. Кто-то может прочитать это и подумать, что i заканчивается значением 0. Это не так, потому что вы инициализировали его с помощью j, который содержит мусор, потому что он сам не был инициализирован.
Предупреждение напоминает вам написать ] A (): i (j), j (0) {}
, что, надеюсь, выглядит более подозрительно.
Это может вас укусить, если ваши инициализаторы имеют побочные эффекты. Примите во внимание:
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
относятся к определенному пользователем типу с конструктором, этот конструктор также может иметь побочные эффекты с тем же неочевидным результатом.
Он также может проявляться, когда инициализатор для одного члена ссылается на другой член.
Предупреждение существует, потому что если вы просто прочитаете конструктор, похоже, что j
инициализируется до i
. Это становится проблемой, если один используется для инициализации другого, как в
struct A {
int i;
int j;
A(): j (0), i (this->j) { }
};
. Когда вы просто смотрите на конструктор, этот выглядит безопасным. Но на самом деле j
еще не был инициализирован в точке, где он используется для инициализации i
, и поэтому код не будет работать должным образом. Отсюда и предупреждение.