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参数。仍然定义两者都是合法的,因为你可能想在两种情况下做一些不同的事情。

相关问题