2014-07-03 23 views
13
#include <vector> 

struct C 
{ 
    std::vector<int> v; 
    decltype(v.begin()) begin() { return v.begin(); } 
    decltype(v.end()) end() { return v.end(); } 
}; 

Clang ++ không có vấn đề, nhưng MSVC 2013 cung cấp cho các lỗi sau:Tại sao Visual Studio 2013 gặp sự cố với decltype thành viên nhóm này?

error C2228: left of '.begin' must have class/struct/union 
+5

Xem http://stackoverflow.com/a/11235245/103167 vì sao kiểu mã hóa này bị hỏng trong bất kỳ trình biên dịch nào và bạn nên sử dụng kiểu trả về cho 'decltype' trên các thành viên của' this'. –

Trả lời

19

Đây là một known bug. Trình biên dịch sẽ chấp nhận mã nếu bạn sử dụng kiểu trả về theo sau.

struct C 
{ 
    std::vector<int> v; 
    auto begin() -> decltype(v.begin()) { return v.begin(); } 
    auto end() -> decltype(v.end()) { return v.end(); } 
}; 

Như báo cáo lỗi nói, một công việc xung quanh là bằng cách sử dụng:

struct C 
{ 
    std::vector<int> v; 
    decltype(std::declval<decltype(v)>().begin()) begin() { return v.begin(); } 
    decltype(std::declval<decltype(v)>().end()) end() { return v.end(); } 
}; 

Nhưng khi @BenVoigt chỉ ra trong các ý kiến, read this answer cho lý do tại sao các loại dấu sự trở lại nên là lựa chọn ưa thích.

+2

Điều gì về loại trả về đuôi, báo cáo lỗi cho biết hoạt động tốt? 'auto begin() -> decltype (v.begin()) {return v.begin(); } 'Có vẻ đẹp hơn với tôi, nếu nó hoạt động đúng –

+0

@BenVoigt Đồng ý, hãy cập nhật câu trả lời. Và cảm ơn vì đã liên kết với câu trả lời đó bởi litb, tôi không nhận thức được giới hạn đó. – Praetorian

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