5

我有這段簡短的代碼片段,我想了解更多有關重載解析選擇一個構造函數的信息。這裏是有問題的代碼: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++標準的拷貝構造函數定義爲比用戶定義的構造函數更好的匹配節*?我的假設否則就是如果沒有規則支持複製構造函數存在,那麼編譯器將按照繼承的順序進行(與具有多重繼承的構造順序一樣),或者給我一個模糊的構造函數調用錯誤。但是,逆轉DerivedBaseOther繼承的順序不會更改輸出,這使我相信我對有關複製構造函數的初始猜測是正確的。任何人都可以向我指出決定我所看到的行爲的規則嗎?

*我檢查cppreference.com's Overload Resolution page,但我沒有看到列出的所有規則可以解釋我看到的行爲(雖然我 沒有完全精通Standardese,所以我可以很容易地錯過了)。

+3

模糊的呼叫爲鐺/海灣合作委員會[演示](http://coliru.stacked-crooked.com/a/0319bddd762f37aa) – Jarod42

+0

模糊調用我的編譯器,不會編譯。 – iheanyi

+1

嗯,有趣。我使用的是Visual Studio 2017.3(Preview),它甚至可以用/ permissive-標誌進行編譯。我假設這是來自Visual Studio的非標準行爲,而不是來自Clang/GCC的非標準行爲? –

回答

1

有問題的代碼片段編譯的原因是由於Visual Studio中的非標準符合行爲(我目前使用VS2017.3 Preview,即使使用/ permissive-flag也可以無錯地編譯代碼)。下面是通過GCC和鏘發射的錯誤:

GCC
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/服用。