从GCC-6.3.0到GCC-8.2.0的哪些变化使此代码可编译?

时间:2019-02-12 22:09:18

标签: gcc undefined-behavior

请查看以下代码。我试图在https://wandbox.org/上进行编译。可以使用GCC-8.2.0进行编译,但不能使用GCC-6.3.0进行编译(错误消息为error: 'key<owner>::key() [with owner = T1]' is private within this context)。我认为GCC-6.3.0的行为是正确的,而错误消息正是我想要看到的。那我想念的是什么?似乎= {}T(int i, key<owner> = {})的存在导致了此问题。但我想知道其背后的原因。是否存在未定义的行为,并且最新版本的编译器将其区别对待?

#include <iostream>
#include <string>

template<class owner>
struct key {
    friend owner;
    private: 
    key(){}
    key(key const& )=default;
    key(key      &&)=default;
};

template<class owner>
struct T {
    T(int i, key<owner> = {}) { std::cout << i << " (not-important)\n"; }
    void fun() {
        T(1); // If uncommented then it should not be possible to compile the code
        std::cout << "void fun (not-important)\n"; }
};

struct T1 {
    static T<T1> fun() { return T<T1>(3); };
};

int main() {
    T<T1>(2); // If uncommented then it should not be possible to compile the code
    T<T1> t = T1::fun();
    t.fun();
}

0 个答案:

没有答案