にだから私はこれは本当に短いコードしていない間++グラムでコンパイルされません:++コードそれが打ち鳴らす++
TEST.CPP
class Base {
public:
Base(int i) {};
};
class Child : public virtual Base {
using Base::Base;
};
int main(int argc, char * argv[]) {
auto *child = new Child(1);
return 0;
};
をそれが打ち鳴らすの下でうまくコンパイル(3.8.0)を:
$ clang++ test.cpp -std=c++11
それはグラムの下で失敗しながら++(5.4.0):
$ g++ test.cpp -std=c++11
test.cpp: In function ‘int main(int, char**)’:
test.cpp:14:30: error: use of deleted function ‘Child::Child(int)’
auto *child = new Child(1);
^
test.cpp:8:17: note: ‘Child::Child(int)’ is implicitly deleted because the default definition would be ill-formed:
using Base::Base;
^
test.cpp:8:17: error: no matching function for call to ‘Base::Base()’
test.cpp:3:9: note: candidate: Base::Base(int)
Base(int i) {};
^
test.cpp:3:9: note: candidate expects 1 argument, 0 provided
test.cpp:1:7: note: candidate: constexpr Base::Base(const Base&)
class Base {
^
test.cpp:1:7: note: candidate expects 1 argument, 0 provided
test.cpp:1:7: note: candidate: constexpr Base::Base(Base&&)
test.cpp:1:7: note: candidate expects 1 argument, 0 provided
何らかの理由で、g ++はBase
クラスにデフォルトのコンストラクタを持つことを期待しています。何故ですか?
編集:これもコピーに失敗します。
Child child(1);
正常に動作します:このコード:これは一方で
auto child = Child(1);
はG ++の下で同じエラーを生成します。しかし、私はまだそれを理解していないのですか?
EDIT 2:キーワードvirtual
がなければ、それは両方のコンパイラの下で正常に動作します。
興味深い。これはChildの 'virtual'継承を削除した場合、またはChild:' Child(int i):Base(i){} 'のコンストラクタを明示的に定義した場合にコンパイルされます。 – 0x5453