(Lời nói đầu: Tôi là người theo dõi muộn tới trò chơi C++ 0x và tranh cãi gần đây về việc loại bỏ các khái niệm khỏi tiêu chuẩn C++ 0x đã thúc đẩy tôi Trong khi tôi hiểu rằng tất cả các câu hỏi của tôi là hoàn toàn giả định - trong chừng mực các khái niệm sẽ không hợp lệ mã C++ trong một thời gian tới, nếu có - tôi vẫn quan tâm đến việc tìm hiểu thêm về các khái niệm, đặc biệt vì nó sẽ giúp tôi hiểu đầy đủ hơn về những thành tích đằng sau quyết định gần đây và tranh cãi đã theo sau)Khái niệm giả thuyết, trước đây-C++ 0x câu hỏi
Sau khi đọc một số tài liệu giới thiệu về các khái niệm như C++ 0x (cho đến gần đây) đã đề xuất chúng, tôi gặp sự cố gói tâm trí của tôi xung quanh một số cú pháp vấn đề. Nếu không có thêm ado, đây là câu hỏi của tôi:
1) Có loại hỗ trợ một khái niệm cụ thể có nguồn gốc (hoặc ngầm, qua từ khóa tự động, hoặc rõ ràng thông qua concept_maps) cũng cần hỗ trợ khái niệm cơ bản một cách độc lập? Nói cách khác, liệu hành động bắt nguồn từ một khái niệm khác (ví dụ: concept B<typename T> : A<T>
) ngầm bao gồm tuyên bố yêu cầu 'vô hình' (trong B, requires A<T>;
)? Sự rắc rối phát sinh từ trang Wikipedia trên khái niệm trong đó nêu:
Giống như trong lớp thừa kế, loại mà đáp ứng các yêu cầu của nguồn gốc khái niệm cũng đáp ứng các yêu cầu của các khái niệm cơ bản.
Điều đó dường như nói rằng một loại chỉ cần thỏa mãn các yêu cầu của khái niệm xuất phát và không nhất thiết là yêu cầu của khái niệm cơ bản, điều này không có ý nghĩa với tôi. Tôi hiểu rằng Wikipedia cách xa một nguồn dứt khoát; là mô tả ở trên chỉ là một sự lựa chọn nghèo của từ?
2) Khái niệm có thể liệt kê tên tệp là 'tự động'? Nếu vậy, trình biên dịch sẽ tự động lập bản đồ các tên tệp này như thế nào? Nếu không, có bất kỳ trường hợp nào khác mà nó sẽ không hợp lệ để sử dụng 'tự động' trên một khái niệm?
Để làm rõ, xem xét các mã giả sau đây:
template<typename Type>
class Dummy {};
class Dummy2 { public: typedef int Type; };
auto concept SomeType<typename T>
{
typename Type;
}
template<typename T> requires SomeType<T>
void function(T t)
{}
int main()
{
function(Dummy<int>()); //would this match SomeType?
function(Dummy2()); //how about this?
return 0;
}
một trong những lớp học có phù hợp SomeType? Hoặc là một khái niệm cần thiết cho khái niệm liên quan đến typenames?
3) Cuối cùng, tôi có một thời gian khó hiểu những gì tiên đề sẽ được phép xác định. Ví dụ: tôi có thể có khái niệm xác định một tiên đề không nhất quán về mặt logic, chẳng hạn như
concept SomeConcept<typename T>
{
T operator*(T&, int);
axiom Inconsistency(T a)
{
a * 1 == a * 2;
}
}
Điều đó sẽ làm gì? Điều đó có hợp lệ không?
Tôi đánh giá cao đây là một số câu hỏi rất dài và vì vậy tôi cảm ơn bạn trước.
Câu trả lời hay. Bạn đã xác nhận những nghi ngờ tôi có về câu hỏi 2) và 3), và tôi chưa bao giờ nghĩ đến 1) theo cách đó. Cảm ơn một lần nữa. – GRB