Trong ví dụ cụ thể này các biến cục bộ sẽ được công bố tốt nhất constexpr
, không const
, bởi vì họ thể được tính tại thời gian biên dịch:
constexpr int g() { return 30; }
constexpr int f()
{
constexpr int x = g();
constexpr int y = 10;
return x + y;
}
Khi f()
được gọi vào thời gian chạy, mà không có sự constexpr
trên x
và y
, (có hoặc không có const
trên x
và y
) bạn đang cung cấp cho trình biên dịch tùy chọn khởi tạo x
và y
tại thời gian chạy thay vì biên dịch thời gian.Với constexpr
trên x
và y
, trình biên dịch sẽ tính x
và y
tại thời gian biên dịch, ngay cả khi f()
được thực hiện tại thời gian chạy.
Tuy nhiên, trong một chức năng khác, không thể luôn sử dụng constexpr
. Ví dụ, nếu f()
và g()
mất một tham số:
constexpr int g(int z) { return z+30; }
constexpr int f(int z)
{
const int x = g(z);
constexpr int y = 10;
return x + y;
}
Bây giờ x
không thể được đánh dấu constexpr
vì z
có thể không phải là một thời gian biên dịch liên tục, và hiện nay là không có cách nào để đánh dấu nó như vậy. Vì vậy, trong trường hợp này, đánh dấu x
const
là cách tốt nhất bạn có thể làm.
Nguồn
2015-11-01 16:22:45
Tôi không đồng ý với tiền đề của bạn bỏ qua 'const' làm cho một chức năng trông" sạch hơn ". Ngoài ra, không, tôi không nghĩ vậy. Nhưng tôi không có 'constexpr't. –
Bạn thậm chí có thể [thay đổi chúng] (http://ideone.com/L4Oa68)! (Và nó hợp lý, nó không làm cho hàm _ không thuần túy) – Lol4t0
@LeoHeinsaar Tôi nghĩ bạn có nghĩa là ít ký tự trắng hơn, bởi vì nếu không nó có thể được tạo ra một cách trivially 'cleaner' theo định nghĩa đó theo cách phổ biến sẽ được hiểu là không đọc được . – hvd