7

就我使用“转换构造函数”而言,它们看起来像这样:

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>

这似乎表明转换构造函数不必“使用单个参数”调用,并且从“其第一个参数的类型”更改为“其参数的类型(注意复数!)进一步支持这一点。虽然我希望“其第一个参数的类型”将更改为“其单个非可选参数的类型”(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)

我不明白复数形式的公式是如何有意义的:它真的表明您可以使用多个参数执行转换吗?这是什么意思?

4

1 回答 1

10

语言被修改为添加初始化列表的一部分。请参阅n2672:init-list 措辞

一个例子:

struct S {
    S(int x, double y) { }
};

void f(S) { }

int main() {
    f({ 42, 42.0 });
}
于 2012-11-20T15:22:31.480 回答