Цитировать стандарт C ++ (3.3.2):
Пункт объявления для имени находится сразу после его полного декларатора и до его инициализатора
В вашем первом утверждении декларатор заканчивается после int i
, и поэтому имя i
доступно там, где оно используется в инициализаторе (= i
), поэтому оператор правильно сформирован, но его поведение определены.
Во втором вашем заявлении декларатор заканчивается после test t(t)
, и инициализатор отсутствует; имя t
является недоступным , доступным там, где вы его используете, поэтому утверждение неверно сформировано.
Так что компилятор ведет себя правильно. Я надеюсь, что он может быть настроен на выдачу предупреждения о первом утверждении, но не обязательно его отклонять; необходимо отклонить второе, как вы говорите.