我有以下代碼:
struct B
{
B(int) {}
};
template <typename T>
class Base : public B
{
friend T;
Base() : B(1) {}
};
class Derived : public Base<Derived>
{
public:
void do_sth() const {}
};
int main()
{
auto x = Derived{}; //Compiles only when using C 11
auto x1 = Derived(); //Compiles using C 17/20 flag
x.do_sth();
x1.do_sth();
}
由于某些原因,由于“x”變數的“不可編譯”初始化,使用 C 17 編譯失敗。編譯器說:
Base::Base() [with T = Derived]' 在此背景關系中是私有的
但正如你所看到的,下面我正在創建一個相同型別的物件,但這次我沒有使用統一初始化。x1 變數可以使用 C 11 或 C 17 標準編譯,但“x”變數只能在 C 11 模式下編譯。這是為什么?導致此問題的標準發生了什么變化?
編譯器資源管理器
uj5u.com熱心網友回復:
顯然Derived是自 C 17 以來的聚合,Derived{}聚合初始化也是如此。( C 17 之前的聚合中不允許基類,現在允許公共非虛擬基類。)
含義Base::Base()由呼叫者 ( main()) 直接呼叫,而不是Derived.
解決方案是添加Derived() {}以Derived阻止它成為聚合。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/455160.html
