Visual Studio С++ компилятор странное поведение
Мне просто интересно узнать, почему эта небольшая часть кода правильно компилируется (и без предупреждений) в Visual Studio. Возможно, результат совпадает с результатом GCC и Clang, но, к сожалению, я не могу их протестировать сейчас.
struct T {
int t;
T() : t(0) {}
};
int main() {
T(i_do_not_exist);
return 0;
}
Ответы
Ответ 1
T(i_do_not_exist);
- это объявление объекта с тем же значением, что и T i_do_not_exist;
.
N4567 § 6.8 [stmt.ambig] p1
В грамматике есть двусмысленность, включающая выражения-утверждения и декларации: выражение-выражение с выражением типа явного типа (5.2.3) как его самое левое подвыражение может быть неотличимым от объявления, в котором первый декларатор начинается с a (
. В этих случаях утверждение является декларацией.
§ 8.3 [dcl.meaning] p6
В объявлении T D
, где D
имеет вид
( D1 )
тип содержащегося идентификатора-декларатора совпадает с типом содержащегося идентификатора declarator в объявлении
T D1
Круглые скобки не изменяют тип встроенного идентификатора declarator-id, но могут изменять привязку сложных деклараторов.
Ответ 2
Поскольку он определяет переменную типа T:
http://coliru.stacked-crooked.com/a/d420870b1a6490d7
#include <iostream>
struct T {
int t;
T() : t(0) {}
};
int main() {
T(i_do_not_exist);
i_do_not_exist.t = 120;
std::cout << i_do_not_exist.t;
return 0;
}
Приведенный выше пример выглядит глупо, но этот синтаксис разрешен по какой-либо причине.
Лучший пример:
int func1();
namespace A
{
void func1(int);
struct X {
friend int (::func1)();
};
}
Возможно, можно найти другие примеры.