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à clang
và vs2015
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.
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
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
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