Clang documentationはきちんとクラスまたは構造体は、ユーザー定義のデフォルトコンストラクタを持っていない継承されたデフォルトコンストラクタもユーザー定義ですか?
場合は、C++ あなたは この([dcl.init]のようにそれのconstのインスタンスを構築するデフォルトを許可しないことを説明して、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"
}
G ++ 4.8は、楽しく、このコードを受け入れ、しかしクラン3.3ありません。スタンダードは何を言いますか?
注(例えばG ++ 4.7.2が以前に受け入れられたのに対し)Base
ためのユーザ定義のデフォルトコンストラクタなし、どちらG ++ 4.8もクラン3.3 Base const b;
を受け入れます。 g ++がルールを知っているとすれば、これはg ++がデフォルトのコンストラクタをユーザ定義としてDerived
とみなしていると考えられます。しかし、Clang 3.3はそうではないと考えています。
UPDATE:0/1引数のコンストラクタが継承されることはありませんことを@JesseGoodの回答に基づいて、私は
Base(int b = 0, void* = nullptr): b_(b) {}
にBase
コンストラクタを変更しようとしたが、それはクランのエラーを解決しません。
あなたは正しく私は質問を誤解していた。 –