2017-07-11 15 views
6

Các mã sau biên dịch tốt trên g ++ (phiên bản khác nhau) nhưng không thành công trên kêu vang ++ - 3.4 với libC++ trên hệ thống của tôi:Có phải std :: constructor mặc định bản đồ rõ ràng không?

#include <map> 
#include <string> 

std::map<std::string, std::string> f() { 
    return {}; 
} 

int main() { 
    auto m = f(); 
} 

kêu vang đánh dấu sự vấn đề sau đây:

x.cpp:6:12: error: chosen constructor is explicit in copy-initialization 
    return {}; 
      ^~ 
/usr/local/Cellar/llvm34/3.4.2/lib/llvm-3.4/bin/../include/c++/v1/map:838:14: note: constructor declared here 
    explicit map(const key_compare& __comp = key_compare()) 
      ^

Trên thực tế, bao gồm tập tin khai báo hàm tạo là explicit. Nhưng nó không được đánh dấu như vậy trong tiêu chuẩn dự thảo C++ 11 của tôi. Đây có phải là lỗi trong clang ++/libC++ không? Tôi không thể tìm thấy báo cáo lỗi có liên quan.

+1

Có vẻ như nó là 'explicit' sau khi tất cả (ít nhất là cho đến khi C++ 14): http://en.cppreference.com/w/cpp/container/map/map –

+0

Trong bản nháp làm việc hiện tại [n4659] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf#subsubsection.26.4.4.1) nó cũng được đánh dấu là 'tường minh '. –

+0

@KonradRudolph Trong ví dụ của bạn và thông báo lỗi, bạn không gọi trình tạo bản sao, vấn đề xuất hiện trước đó - khi bạn đang cố gắng xây dựng mặc định một 'std :: map'. –

Trả lời

9

Không có hàm tạo trống nào trước C++ 14. Mặc định xây dựng cho std::map<Key, Value, Compare, Allocator> được đánh dấu explicit với 2 thông số mặc định cho đến khi C++ 14:

explicit map(const Compare& comp = Compare(), 
       const Allocator& alloc = Allocator()); 

Sau C++ 14, chúng tôi có một phi explicit constructor mặc định rỗng trong đó kêu gọi các nhà xây dựng explicit từ trước (mà bây giờ không không có đối số mặc định Compare):

map() : map(Compare()) {} 
explicit map(const Compare& comp, 
       const Allocator& alloc = Allocator()); 

Vì vậy, ví dụ của bạn sẽ chỉ hợp lệ sau C++ 14.

Nguồn: http://en.cppreference.com/w/cpp/container/map/map

+0

Cảm ơn, có ý nghĩa hoàn hảo. Vì vậy, g ++ 4.8 (với '-std = C++ 1') là sai để chấp nhận nó, đúng không? –

+0

@KonradRudolph Có, GCC đã từ chối điều này khi biên dịch với thư viện chuẩn tuân thủ C++ 11. –

+0

Đủ công bằng, nhưng không phải là một hàm tạo có tham số là tất cả mặc định về mặt kỹ thuật là hàm tạo mặc định - giả sử không có c'tor mặc định "thực"? –

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