http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56922
Bug #: 56922 Summary: set: the default constructor should be explicit Classification: Unclassified Product: gcc Version: 4.8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: akim.demai...@gmail.com Hi all, According to http://llvm.org/bugs/show_bug.cgi?id=15724, there is no default constructor for set, only a constructor whose arguments are optional, but it turns out that this constructor is explicit. So, at least according to C++98 (I don't know about C++11), the following piece of code is expected to fail. $ cat /tmp/set.cc #include <set> int main() { std::set<int> s = {}; } $ g++-mp-4.8 -std=c++11 -Wall /tmp/set.cc Clang rejects it. $ clang++-mp-3.3 -std=c++11 -Wall /tmp/set.cc -stdlib=libc++ /tmp/set.cc:5:17: error: chosen constructor is explicit in copy-initialization std::set<int> s = {}; ^ ~~ /opt/local/libexec/llvm-3.3/bin/../lib/c++/v1/set:378:14: note: constructor declared here explicit set(const value_compare& __comp = value_compare()) ^ 1 error generated. The actual case at hand is a function with an optional argument which is a set, and I used "= {}", which is rejected by clang++. Cheers!