3

以下程序是否形成不良?2默認拷貝構造函數:有可能嗎?

struct Foo 
{ 
    Foo(Foo&) = default; 

    Foo(const Foo&) = default; 
}; 

int main() 
{ 
} 

它成功地compiles with clang++ 3.8.0 and g++ 6.3.0(編譯標誌-std=c++11 -Wall -Wextra -Werror -pedantic-errors)。

+1

嗯..這些不是*默認*複製構造函數。這些是* default ** ed ***拷貝構造函數。除此之外,它們與以常規方式定義的複製構造函數沒有區別(使用'{}')。有兩個複製構造函數在參數上具有不同的const限定是沒有什麼不尋常的。 – AnT

+0

@AnT我很抱歉我的英文不好。當然,默認** ed **。 – Constructor

+0

'Foo(Foo&)'是(也)一個有效的拷貝構造函數。 – Jarod42

回答

7

爲什麼這應該是不合格的?您可以定義兩個拷貝構造函數,一個需要非const參數,另一個可以使用const參數。然後你告訴編譯器它應該使用這兩個構造函數的默認實現。除非編譯器有理由消除默認的拷貝構造函數,否則你也可以刪除這兩行並得到相同的結果。另外我認爲第一個版本是多餘的,因爲無論如何,默認實現應該罰款與const參數。仍然定義兩者都是合法的,因爲你可能想在兩種情況下做一些不同的事情。