Trong khi sản xuất một MCVE cho this vấn đề tôi stumbled khi, tôi đã tìm thấy sự khác biệt sau đây giữa các trình biên dịch:Chuyển tiếp khai báo hàm `constexpr` bên trong một hàm khác - Lỗi trình biên dịch?
Xét đoạn mã sau:
// constexpr int f(); // 1
constexpr int g() {
constexpr int f(); // 2
return f();
}
constexpr int f() {
return 42;
}
int main() {
constexpr int i = g();
return i;
}
Mã này biên dịch trên Clang 3.8.0, nhưng thất bại trên GCC 6.1.0 với:
error: 'constexpr int f()' used before its definition
Bình luận ra // 2
và uncommenting // 1
công trình trên cả hai trình biên dịch.
Điều thú vị là, di chuyển nghĩa f
's ở vị trí của // 1
biên dịch, nhưng gây ra một cảnh báo tại // 2
:
warning: inline function 'constexpr int f()' used but never defined
nào biên dịch là đúng?
Tiêu chuẩn dường như không rõ ràng về điều này. Chúng tôi cần một luật sư mạnh mẽ ở đây :) – Arunmu