オーバーロード解決が1つのコンストラクターを別のコンストラクターよりも選択する理由について、もう少し情報を取得したいこの短いコードスニペットがあります。問題のコードは次のとおりです。
#include <iostream>
struct Base
{
};
struct Other
{
Other(const Other&)
{
std::cout << "Copy Constructor\n";
}
Other(const Base&)
{
std::cout << "Custom Constructor\n";
}
};
struct Derived : public Base, public Other
{
Derived() :
Other(*this)
{
}
};
int main()
{
Derived derived; // Prints "Copy Constructor"
system("pause");
return 0;
}
C ++標準には、コピーコンストラクターをユーザー定義コンストラクターよりも適切に一致するものとして定義するセクションがあると思います*?それ以外の私の仮定は、コピーコンストラクターを優先するルールが存在しない場合、コンパイラーは継承の順序(多重継承の構築の順序と同様)に従うか、あいまいなコンストラクター呼び出しエラーを返すだけであるというものでした。しかし、ここで順序逆転Derived
から継承Base
し、Other
好まれているコピーコンストラクタについての私の最初の推測が正しいと信じて私をリード出力は、変更されませんが。誰かが私が見ている行動を決定するルールを私に指摘できますか?
* cppreference.comの過負荷解決ページを確認しましたが、表示されている動作を説明するルールがリストに表示されていません(ただし、Standardeseに完全に精通しているわけではないため、簡単に見逃してしまう可能性があります)。
問題のコードスニペットがコンパイルされる理由は、Visual Studioの非標準の準拠動作によるものです(現在、VS2017.3プレビューを使用しています。VS2017.3プレビューは、/ permit-フラグがあってもエラーなしでコードをコンパイルします)。以下は、GCCとClangによって発行されたエラーです。
Error(s):
source_file.cpp: In constructor ‘Derived::Derived()’:
source_file.cpp:25:20: error: call of overloaded ‘Other(Derived&)’ is ambiguous
Other(*this)
^
source_file.cpp:16:5: note: candidate: Other::Other(const Base&)
Other(const Base&)
^
source_file.cpp:12:5: note: candidate: Other::Other(const Other&)
Other(const Other&)
^
Error(s):
source_file.cpp:25:9: error: call to constructor of 'Other' is ambiguous
Other(*this)
^ ~~~~~
source_file.cpp:12:5: note: candidate constructor
Other(const Other&)
^
source_file.cpp:16:5: note: candidate constructor
Other(const Base&)
^
1 error generated.
http://rextester.com/から取得したエラー出力。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加