Подтвердить что ты не робот

Visual Studio С++ компилятор странное поведение

Мне просто интересно узнать, почему эта небольшая часть кода правильно компилируется (и без предупреждений) в Visual Studio. Возможно, результат совпадает с результатом GCC и Clang, но, к сожалению, я не могу их протестировать сейчас.

struct T {
    int t;
    T() : t(0) {}
};

int main() {
    T(i_do_not_exist);
    return 0;
}
4b9b3361

Ответ 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)();
   };
}

Возможно, можно найти другие примеры.