gcc
biên dịch đoạn mã sau mà không cần cảnh báo:Đây có phải là phần mở rộng trình biên dịch phù hợp để xử lý các hàm thư viện chuẩn không phải là constexpr như constexpr không?
#include <cmath>
struct foo {
static constexpr double a = std::cos(3.);
static constexpr double c = std::exp(3.);
static constexpr double d = std::log(3.);
static constexpr double e1 = std::asin(1.);
static constexpr double h = std::sqrt(.1);
static constexpr double p = std::pow(1.3,-0.75);
};
int main()
{
}
Không ai trong số các chức năng thư viện chuẩn được sử dụng trên được chức năng constexpr, chúng tôi được phép sử dụng chúng ở đâu một liên tục biểu được yêu cầu từ cả hai the draft C++11 standard và draft C++14 standard phần 7.1.5
[dcl.constexpr]:
[...] Nếu nó được khởi tạo bởi một cuộc gọi hàm tạo, cuộc gọi đó phải là biểu thức liên tục (5.19). Nếu không, hoặc nếu một specifier constexpr được được sử dụng trong một tuyên bố tham khảo, mọi biểu hiện đầy đủ xuất hiện trong initializer của nó sẽ là một biểu thức hằng. [...]
Ngay cả khi sử dụng -std=c++14 -pedantic
hoặc -std=c++11 -pedantic
không có cảnh báo là được tạo (see it live). Sử dụng -fno-builtin
sản xuất lỗi (see it live) mà chỉ ra rằng phiên bản builtin các chức năng thư viện chuẩn bị đối xử như thể họ nơi constexpr
Trong khi clang
không cho phép mã với bất kỳ sự kết hợp của cờ tôi đã cố gắng.
Vì vậy, đây là tiện ích mở rộng gcc
để xử lý ít nhất một số chức năng dựng sẵn như thể chúng là chức năng constexpr mặc dù tiêu chuẩn không yêu cầu chúng rõ ràng. Tôi đã mong đợi ít nhất sẽ nhận được một cảnh báo trong chế độ tuân thủ nghiêm ngặt, đây có phải là một phần mở rộng phù hợp không?
@Walter Tôi đã thêm phần 'LT; DR'. Hãy cho tôi biết nếu có điểm khác tôi có thể làm rõ. –
Còn nội tại thì sao? – Columbo
Tôi không nghĩ rằng nó hữu ích để nói về trình biên dịch nội tại. Tất cả các tên bắt đầu bằng '__' được dành riêng cho việc triển khai thực hiện và việc triển khai thực hiện định nghĩa ngữ nghĩa của chúng. Nó hoàn toàn hợp lý cho ngữ nghĩa của các hàm thực hiện cụ thể, cho dù chúng là intrinisics hay không, được định nghĩa là 'constexpr', hoàn toàn theo ý của người thực hiện. –