2016-04-13 12 views
6

Khi tôi biên dịch các thông tin sau với g++ --std=c++98 -Wall -Werror -Wpedantic Test.cc, không có lỗi.Phương thức lớp mẫu không gây ra lỗi - là phần này của tiêu chuẩn?

template <class T> 
struct TemplateClass { 
    T *ptr; 

    TemplateClass(T *p): ptr(p) {} 

    int foo() { 
    return ptr->bar(); 
    } 
}; 

struct ExampleClass { 
}; 

int main() { 
    TemplateClass<ExampleClass> x(new ExampleClass()); 
} 

tôi mong đợi rằng trình biên dịch sẽ phàn nàn rằng ExampleClass không thực hiện phương pháp bar.

Nhưng có vẻ như nó chỉ phàn nàn nếu tôi thực sự sử dụng phương thức foo.

Tôi có thể dựa vào hành vi này trên bất kỳ trình biên dịch C++ 98 và C++ 11 nào không?

Sự hiểu biết của tôi về các mẫu trước đó là bất cứ khi nào một mẫu được khởi tạo, toàn bộ nội dung được sao chép với T được thay thế bằng đối số mẫu. Đây không phải là cách mẫu hoạt động?

+0

Tôi nghĩ điều này là do các mẫu được đánh giá tại thời gian biên dịch và không có bất kỳ kiểm tra ràng buộc nào. – callyalater

Trả lời

11

Đây là hành vi đúng theo tiêu chuẩn. Định nghĩa của foo không được khởi tạo cho đến khi được sử dụng trong ngữ cảnh yêu cầu nó tồn tại. tôi nhấn mạnh ở bên dưới:

C++ 03, [temp.inst]/1:

Các instantiation tiềm ẩn của một lớp mẫu chuyên môn làm cho tiềm ẩn instantiation của tờ khai, nhưng không của các định nghĩa hoặc các đối số mặc định, của các hàm thành viên lớp, các lớp thành viên, các thành viên dữ liệu tĩnh và các mẫu thành viên; và nó gây ra sự khởi tạo ngầm định của các định nghĩa về các công đoàn ẩn danh của thành viên. Trừ khi một thành viên của một mẫu lớp hoặc một mẫu thành viên được rõ ràng hoặc chuyên môn hóa rõ ràng, chuyên môn của thành viên được ngầm rõ ràng được khởi tạo khi chuyên môn được tham chiếu trong ngữ cảnh yêu cầu định nghĩa thành viên tồn tại; ...

C++ 11, [temp.inst]/1 và [temp.inst]/2:

Trừ một lớp mẫu chuyên môn đã được khởi tạo một cách rõ ràng (14.7.2) hoặc chuyên biệt rõ ràng (14.7.3), chuyên môn mẫu lớp được ngầm hóa rõ ràng khi chuyên môn được tham chiếu trong ngữ cảnh yêu cầu loại đối tượng được xác định hoàn toàn hoặc khi tính đầy đủ của loại lớp ảnh hưởng đến ngữ nghĩa của chương trình. Sự khởi tạo ngầm của một chuyên biệt mẫu lớp gây ra sự khởi tạo ẩn của các khai báo, nhưng không phải là các định nghĩa hoặc đối số mặc định, các hàm thành viên lớp, các lớp thành viên, liệt kê thành viên phạm vi, thành viên dữ liệu tĩnh và mẫu thành viên; ... Trừ khi một thành viên của một mẫu lớp hoặc mẫu thành viên đã được rõ ràng hoặc rõ ràng chuyên môn, chuyên môn của thành viên được ngầm hóa rõ ràng khi chuyên môn được tham chiếu trong một ngữ cảnh yêu cầu định nghĩa thành viên tồn tại; ...

+0

.... đôi khi bạn muốn họ viết những thông số này bằng tiếng Anh đơn giản. Rõ ràng hành vi của OP được dự định trong các đặc điểm kỹ thuật này nhưng bạn phải đọc rất cẩn thận, hoặc biết ngay từ đầu những gì nó là tất cả về (tức là bạn * đã viết * các thông số kỹ thuật). Thật tuyệt vời, họ có thể tạo ra một trình biên dịch làm việc từ điều này. – JvO

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