具有多个非可选参数的转换构造函数是什么样子的?为什么它有意义

How does a converting constructor with more than a single non-optional parameter look like and why does it make sense?

本文关键字:什么样 为什么 有意义 构造函数 转换 参数      更新时间:2023-10-16

就我使用的"转换构造函数"而言,它们看起来是这样的:

struct X {
X(A); // conversion from A -> X
X(B,C = someC); // conversion from B -> X, with some default C
};
X x1 = A(); // calls X::X(A())
X x2 = B(); // calls X::X(B(),someC)

这是完全合理的,据我所知,只要你没有构造函数,它就会起作用:

struct Y {
Y(A,B); // no implicit conversion
};

然而,这正是它变得有趣的地方,C++11标准的字面意思是:

12.3.1构造函数的转换

  1. 在不使用函数说明符explicit的情况下声明的构造函数(可以使用单个参数调用)指定从其第一个参数的类型其参数的类型转换为其类的类型。这样的构造函数称为转换构造函数

(斜体字最初带下划线,但markdown不接受<u>)

这似乎表明已经更改,转换构造函数不必"用单个参数"调用,从"第一个参数的类型"更改为"其参数的类型s"(注意复数!)进一步支持了这一点。虽然我预计"其第一个参数的类型"将更改为"其单个非可选参数的类型"(1),甚至"接收到显式参数的参数类型"(2),以允许这些:

struct Z {
Z(A = a, B, C = c); // (1)
Z(D = d, E = e, F = f); // (2)
};
Z = D(); // (2)
Z = E(); // (2)

我看不出复数形式的公式有什么意义:它真的表明你可以用几个参数进行转换吗?这是什么意思

作为添加初始值设定项列表的一部分,对语言进行了修改。参见n2672:init列表措辞。

一个例子:

struct S {
S(int x, double y) { }
};
void f(S) { }
int main() {
f({ 42, 42.0 });
}