2017-07-11 25 views
6

Aşağıdaki kod g ++ (çeşitli versiyonları) üzerinde ince derler ama ++ clang üzerinde başarısız - sistemimde libc'nin ++ ile 3.4:std :: map default constructor açık mı?

#include <map> 
#include <string> 

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

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

clang aşağıdaki sorunu işaretler: Nitekim

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()) 
      ^

, içerme dosyası kurucuyu explicit olarak bildirir. Ancak C++ 11 taslak standardında böyle işaretlenmemiş. Bu bir clang ++/libC++ hatası mı? İlgili bir hata raporu bulamadım.

+1

görünüyor: http://en.cppreference.com/w/cpp/container/map/map –

+0

Geçerli çalışma taslağında [n4659] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf#subsubsection.26.4.4.1) ayrıca 'açık' olarak işaretlenmiştir '. –

+0

@KonradRudolph Örneğinizde ve hata iletisinde, kopya kurucusunu çağırmıyorsunuz, sorun bundan önce geliyor - varsayılan olarak bir "std :: map" oluşturmaya çalışıyorsunuz. –

cevap

9

C++ 14'den önce boş bir kurucu yok. std::map<Key, Value, Compare, Allocator> için varsayılan inşaat C++ 14 kadar 2 varsayılan parametrelerle explicit işaretlenir:

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

C++ 14 sonra (şimdi yok olan öncesinden explicit oluşturucu çağıran bir sivil explicit boş varsayılan kurucuya sahip

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

Yani örnek yalnızca C++ 14 sonra geçerli olacaktır: varsayılan Compare argüman) sahip değildir.

Kaynak: o (en azından, C++, 14 kadar) sonuçta `explicit` olduğu gibi http://en.cppreference.com/w/cpp/container/map/map

+0

Teşekkürler, mükemmel bir anlam ifade ediyor. Yani g ++ 4.8 (-std = C++ 1' ile) kabul etmek yanlıştı, değil mi? –

+0

@KonradRudolph Evet, GCC bunu bir C++ 11 uyumlu standart kütüphaneyle derlerken reddetmiş olmalı. –

+0

Yeterince adil, ancak parametreleri varsayılan olarak varsayılan olarak varsayılan olarak varsayılan bir kurucu değil - bir "gerçek" varsayılan c'tor var mı? –

İlgili konular