10

Tôi ngạc nhiên bởi những lỗi biên dịch sau:'yếu tố dư thừa trong struct initializer' lỗi với C++ 11 thống nhất khởi

template <typename T> 
struct A 
{ 
    A(T t): t_{t} {} 

    T t_; 
}; 

struct S 
{ 
}; 

int main() 
{ 
    A<S> s{S{}}; 
} 

Lỗi này là (với kêu vang):

test.cpp:4:16: error: excess elements in struct initializer 
    A(T t): t_{t} {} 
      ^
test.cpp:15:10: note: in instantiation of member function 'A<S>::A' requested here 
    A<S> s{S{}}; 
     ^

GCC đưa ra một lỗi tương tự.

Tôi mong đợi biểu thức t_{t} để cố gắng sao chép cấu trúc t_ từ t. Vì S có một hàm tạo bản sao được tạo ngầm, tôi không mong đợi đây là một vấn đề.

Ai đó có thể giải thích những gì đang xảy ra ở đây?

Trả lời

17

S có thể có một hàm tạo bản sao được tạo ngầm, nhưng S cũng là thứ khác. An tổng hợp. Do đó, (hầu hết) việc sử dụng {} sẽ thực hiện khởi tạo tổng hợp trên đó. Vì vậy, nội dung của {} được dự kiến ​​sẽ là giá trị cho các thành viên của tổng hợp. Và kể từ khi tổng hợp của bạn là trống rỗng ... bùng nổ.

Trong mã mẫu, nên tránh cú pháp khởi tạo đồng nhất vì những lý do chính xác này. Đối với loại không xác định T, bạn không thể chắc chắn chính xác những gì {...} sẽ thực hiện.

+0

'nên tránh cú pháp khởi tạo đồng bộ vì chính xác những lý do này ... và vì nhiều lý do khác như thay đổi ngữ nghĩa khi sửa đổi' S'. – ipc

+1

@ipc: Tôi sẽ không đi xa, nhưng thực tế là thỉnh thoảng nó có thể phức tạp :) –

+1

cú pháp khởi tạo không đồng nhất? – zahir

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