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!

Reply via email to