2014-04-13 17 views
8

Một nỗ lực để tạo một thành viên của một cấu trúc với thuộc tính constexpr mà không có kết quả tĩnh trong một lỗi trình biên dịch (xem bên dưới). Tại sao vậy? cho một giá trị không đổi duy nhất tôi sẽ có giá trị này trong bộ nhớ cho đến khi chương trình được định nghĩa thay vì chỉ phạm vi của struct? tôi có nên quay lại sử dụng macro không?Tại sao constexpr phải là tĩnh?

struct foo 
{ 
    constexpr int n = 10; 
    // ... 
}; 

error: non-static data member cannot be constexpr; did you intend to make it static? 
+0

Vâng, sao chép nó sẽ không có ý nghĩa nhiều. – Ben

+1

Tốt hơn một lần trong bộ nhớ tĩnh nhiều lần, một trong mỗi trường hợp của cấu trúc. – chris

+2

Tại sao bạn có bản sao 'constexpr' cho từng đối tượng? –

Trả lời

12

Tôi không biết chính thức hợp lý. Nhưng chắc chắn nó có thể dẫn đến sự nhầm lẫn. Tôi, đối với một, không thể nhìn thấy những gì nó có nghĩa là cho một thành viên dữ liệu không tĩnh là constexpr. Bạn có thể làm như sau?

struct foo { 
    constexpr int n = 10; 
    constexpr foo() { } 
    constexpr foo(int n):n(n) { } // overwrite value of n 
}; 

Hay nó có nghĩa là khởi tạo phải được liên tục luôn, nghĩa là bạn không được phép viết trên (vì n phải là không đổi/khả năng phi thường xuyên có thể) nhưng được phép nói

foo f = { 10 }; 

Quy tắc constexpr int n chỉ đơn giản là hình thành không đúng hơn là hoàn toàn là static có vẻ tốt với tôi, vì ngữ nghĩa của nó sẽ không rõ ràng IMO.

+0

Tôi thấy không có gì sai với 'constexpr int n = 10' vì nó là một kiểu tách rời khi sử dụng' n' trong quá trình biên dịch nên được thay thế bằng giá trị của nó giống như trong trường hợp 'define'. Cú pháp khá rõ ràng, tôi không hiểu tại sao tiêu chuẩn không cho phép nó. –

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