2015-11-23 20 views
5

Theo câu trả lời tôi nhận được here, mã bên dưới không đúng định dạng, mặc dù thực tế là clangvs2015 chấp nhận.Cố gắng hiểu [class.qual]/2 trong tiêu chuẩn C++

#include <iostream> 
class A { 
public: 
    A() { std::cout << "A()" << '\n'; } 
}; 

int main() 
{ 
    A::A(); 
} 

Tuy nhiên, mã bên dưới dường như hoạt động trong cả 3 trình biên dịch (xem live example). AFAICT, theo [class.qual/2] mã bị lỗi. Hay tôi đang thiếu thứ gì đó ở đây?

#include <iostream> 
struct B { B() { std::cout << "B()" << '\n'; } }; 
struct A : public B { }; 
int main() 
{ 
    A::B(); 
} 

Ngoài ra, theo [class.qual]/2, mã dưới đây cũng như hình thành và trong trường hợp này, tất cả 3 trình biên dịch tạo ra kết quả mong muốn (xem ví dụ here).

include <iostream> 
struct B { B() { std::cout << "B()" << '\n'; } }; 
struct A : public B { using B::B; A() { std::cout << "A()" << '\n'; } void f() { B(); } }; 
int main() 
{ 
    A a; 
    a.f(); 
} 

Output:

B() 
A() 
B() 

Nhưng tôi muốn biết tính hữu ích của một sử dụng-khai đặt tên một constructor là gì, như là một (using B::B;) trong lớp A trên. Lưu ý rằng việc sử dụng khai báo này hoàn toàn không liên quan trong trường hợp này, bất kể B là lớp cơ sở của A hay không.

Trả lời

3

Tôi nghĩ rằng mẫu thứ hai của bạn được tạo đúng. Quy tắc trong [class.qual]/2 nói rằng tên đề cập đến hàm tạo nếu tên được chỉ định sau tên-lồng nhau-specifier khi tra cứu trong C là tên được phân loại là C. Trong trường hợp của A::B, tên được chỉ định sau tên được chỉ định lồng nhau là tên lớp được tiêm của B (hiển thị do thừa kế), không phải là A. Trong trường hợp này, A::B không rõ ràng tên một loại, A::B() tạo một phiên bản tạm thời B.

Sử dụng-khai báo tên nhà xây dựng có thể hữu ích để thúc đẩy nhà xây dựng cơ sở hạng mà một vài tham số:

struct B { B(int a) { std::cout << "B " << a << '\n'; } }; 
struct A : public B { using B::B; }; 
int main() 
{ 
    A a{1}; //would not be valid without the using-declaration 
} 
+0

dụ của bạn có vẻ ở trên để xác nhận những gì bạn đang nói. Nhưng bạn có thể cung cấp một báo giá từ tiêu chuẩn hỗ trợ xây dựng này. Tôi chưa từng thấy công trình này trước đây. – Belloc

+0

Các tiêu chuẩn là một chút dài để gắn nó trong câu hỏi của tôi, nhưng có thể bạn sẽ muốn nhìn vào '[class.inhctor]' – TartanLlama

+0

Sau khi xem nhanh [class.inhctor] Tôi phải đồng ý với bạn. Có vẻ như để trả lời câu hỏi thứ hai của tôi (+1). Nhưng tôi vẫn không tin vào câu hỏi đầu tiên của tôi. – Belloc

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