的Clang documentation整齊地解釋說,是否也是用戶定義的繼承的默認構造函數?
如果一個類或結構有沒有用戶定義的默認構造函數,C++ 不允許默認構造它的一個常量例如像 這個([dcl.init] ,P9)
以下代碼具有這樣爲Base
用戶定義的默認的構造,但g ++以及鏘不同意爲Derived
默認構造是否是用戶定義的,即使Derived
不明確地繼承所有的層構造(使用new C++11 inheriting constructors feature)
#include <iostream>
class Base
{
public:
Base(): b_(0) {} // look! user-defined default constructor
void print() const { std::cout << b_ << "\n"; }
private:
int b_;
};
class Derived
:
public Base
{
using Base::Base; // does this constitute a user-defined default constructor?
};
int main()
{
Base const b;
b.print(); // 0 for g++ & CLang
Derived const d;
d.print(); // 0 for g++, Clang: "default initialization of an object of const type 'const Derived' requires a user-provided default constructor"
}
克++ 4.8愉快地接受這個代碼,但鏘3.3沒有。標準說什麼?
注:無爲Base
用戶定義的默認的構造,既克++ 4.8也不鏘3.3接受Base const b;
(而例如克++ 4.7.2先前接受的是)。鑑於g ++知道該規則,我認爲這意味着g ++將Derived
的默認構造函數視爲用戶定義的。但是Clang 3.3認爲不然。
UPDATE:基於@JesseGood的回答是0/1參數構造函數永遠不會遺傳的,我試圖改變Base
構造函數
Base(int b = 0, void* = nullptr): b_(b) {}
,但它不能解決鏘錯誤。
你是對的我誤解了這個問題。 –