C ++中用户定义转换的顺序

时间:2017-08-17 13:27:08

标签: c++ type-conversion implicit-conversion

我在C ++中面临一系列用户定义转换的问题。 请考虑以下代码:

struct A
{
    A(int);
};

struct B
{
    B(A);
};

struct C
{
    C(B);
};

构造函数在某处定义。 现在,以下语句可以正常工作:

A(1);       // A <- int

B(1);       // B <- A <- int

C(A(1));    // C <- B <- A <- int
C(B(1));    // C <- B <- A <- int
C(B(A(1))); // C <- B <- A <- int

但是,当我尝试编译以下内容时:

C(1);       // C <- B <- A <- int

我收到以下错误:

error: no matching function for call to ‘C::C(int)’
no known conversion for argument 1 from ‘int’ to ‘B’

我知道这样的构造在C ++中是非法的。 不过,我的问题是:

  • 我怎样才能绕过它?我正在寻找一些优雅的解决方案。 C(B(A(1)))的结构有点烦人。

为了完整起见,我发现了几个相关问题(例如Why user-defined conversions are limited?)。但是,没有人提出我的问题。

1 个答案:

答案 0 :(得分:0)

正如你所说,你的第一个问题已经得到解答。

至于解决方法,假设你不想在你的C类中添加A构造函数,你可以只使用一个允许的隐式转换:

C(B(1));

以下内容也适用:

C(A(1));