Рассмотрим следующую демонстрационную программу.
#include <iostream>
int main()
{
typedef float T;
0.f.T::~T();
}
Эта программа составлена Microsoft Visual Studio Community 2019
.
Но clang
и gcc
выдать ошибку, как это
prog.cc:7:5: error: unable to find numeric literal operator 'operator""f.T'
7 | 0.f.T::~T();
| ^~~~~
Если написать выражение вроде, ( 0.f ).T::~T()
то все три компилятора компилируют программу.
Возникает вопрос: является ли эта запись 0.f.T::~T()
синтаксически достоверной? А если нет, то какое синтаксическое правило нарушено?
(0.f).T::~T();
float f = 1.0f.t;
выдаст ошибку о числовом литерале.
float
является встроенным типом, он не имеет деструктора для вызова. Что вы вообще делаете, вручную вызывая деструкторы? За пределами места размещения - новая территория, это должно быть большим нет-нет.
0.f
и.T
заставляет их принять это ...