Boost logo

Boost :

Subject: [boost] [contract] auto_..._error regression tests fail on C++1z
From: Lorenzo Caminiti (lorcaminiti_at_[hidden])
Date: 2017-09-28 22:58:57


Hello all,

I asked this question on compl.c++ list as well, given this is more of
a general C++1z question than a Boost question. However, this is
making some Boost.Contract regression tests fail on C++1z compilers so
I wanted to ask it here as well hoping to get some info more
quickly...

Following code prevents copies outside its friend function f:

    // File: 05.cpp

    struct x {
        x() {}
    private:
        x(x const&) {}
        x& operator=(x const&) { return *this; }

        friend x f();
    };

    x f() { return x(); }

    int main() {
        auto xx = f();
        return 0;
    }

Correctly it does not compile up to C++1y because main cannot access
the copy operations:

    $ clang++ -std=c++1y 05.cpp
    05.cpp:14:15: error: calling a private constructor of class 'x'
        auto xx = f();
                  ^
    05.cpp:5:5: note: declared private here
        x(x const&) {}
        ^
    1 error generated.

However, it compiles on C++1z?!

    $ clang++ -std=c++1z 05.cpp
    # Not compiler errors?!

Why... what changed in C++1z that makes the above compile? How can I
prevent copying x outside its friend function f in C++1z?

Thanks,
--Lorenzo


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk