2013-02-25 32 views
11

Bạn có thay thếTôi có nên thay thế 'const int' bằng 'constexpr int' trong C++ 11 bất cứ khi nào có thể không?

const int one = 1; 
const int two = 2; 

bằng cách này?

constexpr int one = 1; 
constexpr int two = 2; 

Sự hiểu biết của tôi có chính xác là cả hai khối đều giống hệt về mặt ngữ nghĩa và hiện tại chỉ là vấn đề về hương vị?

Mặt khác, như constexpr ngụ ý const, bạn có thể cho rằng phù hợp hơn để luôn thích hình thức hạn chế hơn, ngay cả trong những tình huống nhỏ mà nó không tạo sự khác biệt?

(Tôi hiểu rằng tình hình hoàn toàn thay đổi khi biểu thức ở bên phải được phép phức tạp hơn. Vì vậy, để làm rõ, câu hỏi chỉ tập trung vào trường hợp đơn giản nhất mà biểu thức là số nguyên cố định.)

+1

Điều duy nhất tôi có thể nghĩ là nếu bạn chỉ định một cái gì đó giống như API, bạn có thể quyết định sử dụng 'const int' để lưu trữ một biểu thức liên tục vì thuộc tính đó có thể không giữ trong các bản sửa đổi trong tương lai. – Pubby

Trả lời

13

tôi nghĩ rằng tuyên bố của bạn nói rằng constconstexpr "ngữ nghĩa giống hệt" nên được sửa đổi: cả hai đều tuyên bố đối tượng có giá trị không thể thay đổi, nhưng constexpr cũng đòi hỏi sự biểu hiện khởi tạo được tính toán tại thời gian biên dịch.

Bây giờ nếu biểu thức ở phía bên tay phải không thể được tính tại thời điểm biên dịch, sử dụng constexpr không nằm trong câu hỏi. Mặt khác, miễn là initializer là một chữ, bạn có thể sử dụng sử dụng constexpr, nhưng lưu ý những gì ngữ nghĩa của biến của bạn là: biến không đổi của bạn thực sự đại diện cho một cái gì đó có giá trị nên được tính tại compile- thời gian?

Trong quang học bảo trì/tiến hóa SW, có thể bạn sẽ thay đổi cách bạn khởi tạo biến của mình trong suốt thời gian: ngày hôm nay trình khởi tạo là chữ, ngày mai nó có thể là một biểu thức phức tạp hơn.

Bất kể con đường bạn đang gán cho nó một giá trị tại, bạn có nghĩ rằng i bao giờ sẽ cần phải được khởi tạo bởi bất cứ điều gì khác hơn là một chữ, và rằng biểu thức khởi tạo có thể không tính toán tại thời gian biên dịch? Nếu đúng như vậy, thì chỉ cần tạo biến số const của bạn, ngay cả khi bạn hiện đang khởi tạo biến đó bằng chữ; nếu không, hãy làm cho nó constexpr.

Nói cách khác, chọn vòng loại thể hiện tốt nhất ngữ nghĩa của biến của bạn.

+2

Tôi sẽ bật lời khuyên cuối cùng trên đầu của nó: tự hỏi mình: "Tên này có cần được giải quyết vào lúc biên dịch không?" (ví dụ: tôi sử dụng nó như một kích thước mảng hoặc giá trị enum ở đâu đó.) Nếu vậy, hãy sử dụng 'constexpr' để không ai bị cám dỗ thay đổi nó theo cách sẽ làm cho việc sử dụng tên thất bại. – rici

+3

@rici: Làm cho tinh thần, nhưng tôi nghĩ rằng OP là chủ yếu quan tâm đến các trường hợp khi câu trả lời cho câu hỏi trong bình luận của bạn là "không". Khi câu trả lời là "có", chắc chắn biến sẽ được tạo thành 'constexpr'. Nhưng điều gì sẽ xảy ra nếu bộ khởi tạo không thực sự cần phải là một biểu thức 'constexpr', và bây giờ chỉ là một biểu hiện? Đó là câu hỏi tôi đã cố gắng trả lời. –

+0

đủ công bằng, nhưng có vẻ như tôi rất khó trả lời câu hỏi "có lẽ" một ngày nào đó tôi cần được khởi tạo bởi một cái gì đó phức tạp hơn một chữ?", và rất dễ trả lời câu hỏi" Có phải 'tôi cần phải được biết tại thời gian biên dịch không?" Sử dụng 'constexpr' để chỉ ra cái sau cung cấp thông tin hữu ích cho trình đọc mã, sử dụng' const' để chỉ ra rằng bạn tưởng tượng – rici

Các vấn đề liên quan