C++ 为什么可以';我们不能重载一个构造函数来给它添加一个默认参数 我们考虑下面的例子:

C++ 为什么可以';我们不能重载一个构造函数来给它添加一个默认参数 我们考虑下面的例子:,c++,constructor,C++,Constructor,一, #包括 结构X{ X(){}; X(常数X&,整数i=6); }; X::X(constx&X,inti){std::cout可以像函数一样重载构造函数 X::X(const X& x) //The copy constructor 及 在您的情况下:xz=X; 这是因为编译器将它扩展到xz(X);,它可以是普通的构造函数或复制构造函数。关键是,一个类是平凡的,还是平凡的可复制的,等等,都应该根据类定义来决定,而不需要了解整个程序。§8.3.6[dcl.fct.default]

一,

#包括
结构X{
X(){};
X(常数X&,整数i=6);
};

X::X(constx&X,inti){std::cout可以像函数一样重载构造函数

X::X(const X& x) //The copy constructor 

在您的情况下:
xz=X;


这是因为编译器将它扩展到
xz(X);
,它可以是普通的构造函数或复制构造函数。

关键是,一个类是平凡的,还是平凡的可复制的,等等,都应该根据类定义来决定,而不需要了解整个程序。§8.3.6[dcl.fct.default]/p6(引用N4140):

除了类模板的成员函数外,默认参数 在类外部出现的成员函数定义中 将定义添加到 类定义中的成员函数声明;程序是 如果默认构造函数(12.1)、复制或移动构造函数, 或复制或移动赋值运算符(12.8)如此声明


请参阅。

您在哪里找到N4140?该链接已断开。@DmitryFucintv github repo。
#include <iostream>

struct X {
    X(){ };
    X(const X&, int i);
};

X::X(const X& x, int i = 7) { std::cout << "ctor" << std::endl; } //error:
//addition of default argument on redeclaration makes this constructor a copy constructor

X x;

X z = x;

int main()
{ 

}
#include <iostream>

void foo(int i);
void bar(int j = 7);

void foo(int i = 7){ }
void bar(int j){ }

int main()
{ 

}
X::X(const X& x) //The copy constructor 
X::X(const X& x, int i = 7) //A normal constructor