Là một followup để this question, gcc và Clang cả xem xét chương trình này vô hình thành:khởi tham khảo và các biểu thức liên tục
int main() {
const int& ri = 0;
constexpr int i = ri;
}
Lỗi này là về giá trị của ri
là không sử dụng được trong một biểu thức hằng. 0
chắc chắn là một biểu thức liên tục cốt lõi, và như là một biểu thức hằng số lõi prvalue dường như đáp ứng these constraints (tầm thường, vì int
không phải là loại lớp, con trỏ hoặc mảng). Vì vậy, không nên ri
đáp ứng this criteria?
Điều này cũng đúng nếu tôi sử dụng một prvalue đen của kiểu lớp:
struct X { };
int main() {
const X& rx = X{};
constexpr X x = rx;
}
Một đối tượng không thể là lớp, con trỏ và loại mảng cùng một lúc. Không có đối tượng nào có thể đáp ứng tất cả các ràng buộc. Nó phải thỏa mãn cái thích hợp. Một đối tượng kiểu 'int' thỏa mãn cả hai. Vì vậy, không, 'ri' sẽ không áp dụng. – StoryTeller
D'oh. Cảm ơn bạn đã làm cho tôi biết rằng tôi đã hiểu sai [\ [expr.const \]/6] (http://eel.is/c++draft/expr.const#6.sentence-2). Nó nên đọc "đối tượng có thời gian lưu trữ tĩnh (hoặc không phải là đối tượng tạm thời hoặc là đối tượng tạm thời có giá trị thỏa mãn các ràng buộc trên)", không phải "(đối tượng có thời lượng lưu trữ tĩnh không phải là đối tượng tạm thời) hoặc (là một đối tượng tạm thời có giá trị thỏa mãn các ràng buộc trên) "#:. – cpplearner
@StoryTeller Ràng buộc 'P -> Q' được thỏa mãn bởi'! P'. – Barry