我有這段簡短的代碼片段,我想了解更多有關重載解析選擇一個構造函數的信息。這裏是有問題的代碼:C++構造函數重載解析具有多重繼承
#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's Overload Resolution page,但我沒有看到列出的所有規則可以解釋我看到的行爲(雖然我 沒有完全精通Standardese,所以我可以很容易地錯過了)。
模糊的呼叫爲鐺/海灣合作委員會[演示](http://coliru.stacked-crooked.com/a/0319bddd762f37aa) – Jarod42
模糊調用我的編譯器,不會編譯。 – iheanyi
嗯,有趣。我使用的是Visual Studio 2017.3(Preview),它甚至可以用/ permissive-標誌進行編譯。我假設這是來自Visual Studio的非標準行爲,而不是來自Clang/GCC的非標準行爲? –