2009-07-29 33 views
11

(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.

Trả lời

10

Tôi đã sử dụng bản nháp C++ 0x gần đây nhất, N2914 (vẫn có khái niệm từ ngữ trong đó) làm tham chiếu cho câu trả lời sau.

1) Các khái niệm giống như giao diện trong đó. Nếu kiểu của bạn hỗ trợ một khái niệm, nó cũng sẽ hỗ trợ tất cả các khái niệm "cơ bản". Wikipedia tuyên bố bạn báo giá có ý nghĩa từ quan điểm của một khách hàng của loại - nếu anh ta biết rằng T thỏa mãn khái niệm Derived<T>, sau đó anh ta cũng biết rằng nó đáp ứng khái niệm Base<T>. Từ góc độ tác giả loại, điều này tự nhiên có nghĩa là cả hai phải được thực hiện. Xem 14.10.3/2.

2) Có, khái niệm với typename thành viên có thể là auto. Các thành viên như vậy có thể được tự động suy luận nếu chúng được sử dụng trong định nghĩa của các thành viên chức năng trong cùng một khái niệm. Ví dụ: value_type cho trình lặp có thể được suy ra dưới dạng kiểu trả về của số operator*. Tuy nhiên, nếu một thành viên loại không được sử dụng ở bất cứ nơi nào, nó sẽ không được suy luận, và do đó sẽ không được xác định ngầm định. Trong ví dụ của bạn, không có cách nào để suy ra SomeType<T>::Type cho Dummy hoặc Dummy1, vì Type không được sử dụng bởi các thành viên khác của khái niệm, do đó, không lớp nào sẽ ánh xạ tới khái niệm (và trên thực tế, không có lớp nào có thể tự động ánh xạ cho nó). Xem 14.10.1.2/11 và 14.10.2.2/4.

3) Tiên đề là điểm yếu của thông số kỹ thuật và chúng được cập nhật liên tục để làm cho một số ý nghĩa hơn. Ngay trước khi các khái niệm được kéo ra khỏi bản nháp, có một số paper đã thay đổi một chút - hãy đọc nó và xem nó có hợp lý hơn với bạn hay không, hoặc bạn vẫn có câu hỏi liên quan đến nó.

Ví dụ cụ thể của bạn (tính toán sự khác biệt cú pháp), điều đó có nghĩa là trình biên dịch sẽ được phép xem xét biểu thức (a*1) tương tự như (a*2), với mục đích của quy tắc "as-if" của ngôn ngữ (ví dụ: trình biên dịch được phép thực hiện bất kỳ tối ưu hóa nào, miễn là kết quả hoạt động như thể không có). Tuy nhiên, trình biên dịch không theo bất kỳ cách nào được yêu cầu để xác nhận tính chính xác của các tiên đề (do đó tại sao chúng được gọi là tiên đề!) - nó chỉ lấy chúng cho chúng là gì.

+0

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

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