具有多个非可选参数的转换构造函数如何看起来如何?为什么它有意义?

bit*_*ask 7 c++ constructor type-conversion language-lawyer c++11

至于我使用"转换构造函数",它们看起来像这样:

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)
Run Code Online (Sandbox Code Playgroud)

这是完全合理的,据我所知,只要你没有构造函数:

struct Y {
  Y(A,B); // no implicit conversion
};
Run Code Online (Sandbox Code Playgroud)

然而,这是它变得有趣的地方,C++ 11标准从字面上读取:

12.3.1按构造函数转换

  1. 无功能说明符中声明的构造explicit 可与一个单一的参数被称为指定从一个转换的第一个参数的类型 的类型及其参数到它的类的类型.这样的构造函数称为转换构造函数.

(斜体最初加下划线,但降价不接受<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)
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*lis 10

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

一个例子:

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

void f(S) { }

int main() {
    f({ 42, 42.0 });
}
Run Code Online (Sandbox Code Playgroud)