Рассмотрим следующую демонстрационную программу.
#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заставляет их принять это ...