type_traits und access modifiers



  • Guten Morgen

    Ich habe unterschiedliches Verhalten der type_traits festgestellt. Gegeben sei folgendes Stück Code, womit man den Effekt testen kann:

    #include <type_traits>
    
    class foo
    {
    private:
        foo()
        {
        }
    };
    
    int main()
    {
        static_assert(std::is_default_constructible<foo>::value, "Nope.");
        return 0;    
    }
    

    Das spannende ist hier natürlich, dass der Konstruktor von foo private ist. Nun ist es so, dass z.B. LLVM mir sagt, dass das nicht geht - Visual C++ (neuste Version 2013 CTP) hingegen findet schon und kompiliert das anstandslos.

    Was ist nun richtig, und was sagt der Standard darüber? Ich konnte spontan nichts finden 😕

    Freundliche Grüsse



  • [...]has an accessible explicit or implicit default constructor.[...]

    Quelle

    Von daher tipp' ich mal, dass MSVC der Bösewicht ist.



  • Gleich kommt Sone wieder an und flamet gegen den MSVC 😃



  • Skym0sh0 schrieb:

    Gleich kommt Sone wieder an und flamet gegen den MSVC 😃

    Gegen den C++-Compiler: Zu Recht.



  • Ich habe jetzt ne Weile im Standard rumgegurkt, aber nichts klares gefunden, bist auf:

    20.11.4.3/6 schrieb:

    Given the following function prototype:

    template <class T>
    typename add_rvalue_reference<T>::type create();
    

    the predicate condition for a template specialization is_constructible<T, Args...> shall be satisfied
    if and only if the following variable definition would be well-formed for some invented variable t:

    T t(create<Args>()...);
    

    is_default_constructable erfordert is_constructable. Und

    T t(create<Args>()...);
    

    impliziert, dass man T auch ohne Argumente, also default konstruieren kann.


Anmelden zum Antworten