请查看以下代码。我试图在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();
}