2016-09-27 20 views
17

Theo this, một chức năng khai báo với constexpr phải đáp ứng một vài yêu cầu, một trong số đó là như sau:hàm constexpr phải có một giá trị đối số?

tồn tại ít nhất giá trị một đối số như rằng một lời gọi của hàm có thể được một đánh giá subexpression của một biểu thức hằng lõi ...

Vâng, constexpr chức năng có thể có không có đối số:

constexpr int Bar(/* empty */) { return 0xFF; } 
constexpr int value = Bar(); // Valid expression 

constexpr chức năng được gọi là một thường trình con không thể xác định toàn bộ biểu thức là biểu thức liên tục lõi.

Vì vậy, điều này có ý nghĩa gì bởi một giá trị đối số phải tồn tại?

[Cập nhật cho độc giả tương lai]

Rõ ràng mô tả về các yêu cầu của constexpr function đã được cố định kể từ khi câu hỏi này từ:

tồn tại ít nhất một đối số giá trị như vậy mà một việc gọi hàm có thể là biểu thức con được đánh giá của biểu thức hằng số lõi ...

tới:

tồn tại ít nhất một bộ luận đánh giá cao như rằng một lời gọi của hàm có thể là một subexpression đánh giá của một biểu thức hằng lõi ...

+3

Tôi * nghĩ * có nghĩa là * đối với mỗi đối số * tồn tại ít nhất, v.v. –

+0

@MartinBonner no, nó có nghĩa là cho tất cả các đối số như là một toàn bộ –

Trả lời

19

Các trích dẫn từ en.cppreference.com là không chính xác liên quan đến tiêu chuẩn, báo giá thực là (§ 7.1.5/5):

Đối với một constexpr chức năng hoặc constexpr xây dựng mà không phải là defaulted cũng không một mẫu, nếu không có giá trị đối số tồn tại sao cho một lời gọi hàm hoặc hàm tạo có thể là một biểu thức con được đánh giá của biểu thức hằng số lõi (5.20) [...] thì chương trình đó không đúng định dạng; không cần chẩn đoán.

Về cơ bản, phải tồn tại một bộ đối số hợp lệ (bộ trống là một bộ hợp lệ trong trường hợp của bạn).

+2

Vì vậy, họ screwed up inverting của từ ngữ. – Yakk

+0

Nếu tập rỗng cũng được coi là một tập hợp hợp lệ, chúng ta thậm chí có thể có ít hơn 'một tập hợp các giá trị đối số' không? (vì mọi chức năng phải có ít nhất một bộ, bao gồm một tập rỗng.) Tôi chỉ tò mò nếu đó chỉ là một số hình thức để viết tiêu chuẩn. –

+1

@DeanSeo Bạn có thể có ít hơn một ** tập hợp các đối số ** hợp lệ - 'constexpr int f (std :: string)' không hợp lệ vì 'std :: string' không thể là' constexpr' vì vậy bất kỳ nội dung nào của ' f' có thể là, sẽ không bao giờ là một tập hợp các đối số hợp lệ để thực hiện lệnh gọi 'f' một biểu thức không đổi. – Holt

7

"Một lập luận giá trị "ở đây có nghĩa là" một bộ đối số ". Hàm Nullary có một bộ đối số có thể, tập rỗng.

Trong trường hợp của bạn, bộ đối số trống duy nhất này dẫn đến cuộc gọi constexpr hợp lệ, vì vậy mọi thứ đều ổn.

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