Hãy xem xét các chương trình trình diễn sau đây.
#include <iostream>
int main()
{
typedef float T;
0.f.T::~T();
}
Chương trình này được biên soạn bởi Microsoft Visual Studio Community 2019
.
Nhưng clang
và gcc
đưa ra một lỗi như thế này
prog.cc:7:5: error: unable to find numeric literal operator 'operator""f.T'
7 | 0.f.T::~T();
| ^~~~~
Nếu để viết biểu thức như thế ( 0.f ).T::~T()
thì cả ba trình biên dịch biên dịch chương trình.
Vì vậy, một câu hỏi đặt ra: hồ sơ này 0.f.T::~T()
có hợp lệ về mặt cú pháp không? Và nếu không, thì quy tắc cú pháp nào bị phá vỡ?
(0.f).T::~T();
float f = 1.0f.t;
sẽ tạo ra lỗi về chữ số.
float
là một built-in loại, nó không có một destructor để bạn có thể gọi. Bạn thậm chí đang làm gì bằng cách gọi thủ công hủy diệt? Bên ngoài lãnh thổ vị trí mới, đó sẽ là một điều không nên lớn .
0.f
và.T
khiến cả GCC và Clang chấp nhận điều này ...