2014-12-01 19 views
5

Trong đoạn mã sau, cấu trúc khuôn mẫu BB và CC gần giống hệt ngoại trừ các hàm tạo. Mẫu BB sử dụng một hàm tạo không làm gì trong khi khuôn mẫu CC sử dụng hàm tạo mặc định. Khi tôi biên dịch nó sử dụng Visual Studio 2013 cập nhật 4, một lỗi được ném trong dòng khai báo constInst2 nhưng không phải trên dòng khai báo constInst:Hàm tạo dựng ngầm so với hàm tạo "rỗng"

lỗi C4700: biến cục bộ chưa được khởi tạo 'instance2' sử dụng"

tôi mong đợi các lỗi tương tự khi khởi tạo 'dụ' là tốt. tôi hiểu sai this sentence?

"Nếu constructor mặc định ngầm-tuyên bố sẽ không bị xóa hoặc tầm thường, nó được xác định (có nghĩa là, một cơ quan chức năng được tạo ra và biên soạn) bởi trình biên dịch, và nó có chính xác tác dụng tương tự như một constructor người dùng định nghĩa nội dung trống và danh sách initializer trống."

struct AA 
{ 
    typedef int a; 
    typedef const int b; 
}; 

template< typename A > 
struct BB 
{ 
    typename A::a a_A; 
    typedef typename A::b a_B; 

    BB() 
    {}; 
}; 

template< typename A > 
struct CC 
{ 
    typename A::a a_A; 
    typedef typename A::b a_B; 

    CC() = default; 
}; 

int main() 
{ 
    BB<AA> instance; 
    BB<AA>::a_B constInst(instance.a_A); 

    CC<AA> instance2; 
    CC<AA>::a_B constInst2(instance2.a_A); 

    return 0; 
} 
+1

Khi đặt câu hỏi về lỗi trình biên dịch cụ thể, vui lòng bao gồm thông báo lỗi đầy đủ trong câu hỏi. Nó giúp rất nhiều. –

+0

@MarkRansom: Đã cập nhật câu hỏi. – Hector

+0

@Hector Tôi lấy nguyên văn mã của bạn, biên dịch nó với Visual Studio 2013 Update 4, và chỉ nhận được cảnh báo: 'cảnh báo C4700: uninitialized local variable 'instance2' used' Nó cũng biên dịch không có vấn đề ở đây: http: // ideone. com/Hc1jB4 – PaulMcKenzie

Trả lời

1

Có một cờ trình biên dịch trong Visual Studio để xử lý cảnh báo dưới dạng lỗi (/ WX). Bạn có thể tắt cờ đó để không coi cảnh báo là lỗi. Bạn cũng có thể chọn bỏ qua các cảnh báo cụ thể (/ wd4100 để tắt cảnh báo C4100).

Điều bạn đang thấy là cảnh báo trình biên dịch đang được coi là lỗi.

Điều này không liên quan đến việc diễn giải báo giá từ tiêu chuẩn.

Trong trường hợp

BB<AA> instance; 

trình biên dịch không phát hành một thông điệp cảnh báo kể từ khi bạn có thể làm một cái gì đó trong các nhà xây dựng có tác dụng phụ. Trình biên dịch đang chọn không nghiên cứu kỹ các chi tiết về cách hàm tạo được triển khai để suy luận xem việc gọi hàm tạo có tác dụng phụ hay không.

Trong trường hợp của

CC<AA> instance2; 

nó có thể suy ra rằng không có tác dụng phụ của xây dựng các đối tượng.

+0

Trong VS 2017 nó thực sự là một lỗi. Không phải là cảnh báo. Và tôi chắc chắn đã không bật "Treat Warnings As Errors". Vẫn là một câu trả lời tuyệt vời. – TobiMcNamobi

+0

@TobiMcNamobi, tôi không có quyền truy cập vào VS 2017. Hy vọng bạn nhận được câu trả lời từ một nguồn khác. –

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