1

这段代码:

class foo
{
    int x;
public:
    foo(int x) : x(x) { }
    int get() const { return x; }
    //...
};

class bar
{
    int x;
public:
    bar(const foo& x) : x(x.get()) { }
    int get() const { return x; }
    bar& operator =(const foo& rhs) { x = rhs.get(); return *this; }
    //...
};

void func()
{
    foo f = 3;
    bar b = 3;
    b = 7;
    //...
}

在线出错bar b = 3(g++ 4.7.1 with -fstd=gnu++11):

error: conversion from 'int' to non-scalar type 'bar' requested

但是,我提供了一个bar构造函数,它采用foo, 并且 ints 可以隐式转换为foo如前面的行所示。那么,出了什么问题?

顺便说一句,出于多种原因,不希望强制转换为foo使用foo(3),因为这会使我的实际代码难看使用和阅读。

4

2 回答 2

5

我提供了一个接受 foo 的 bar 构造函数,并且 ints 可以隐式转换为 foo,如它前面的行所示。那么,出了什么问题?

C++ 中不允许链式转换,这意味着(链式)转换不能发生:

int -> foo -> bar  //not allowed (chained conversion)

即使给出了以下内容:

int -> foo  //given
foo -> bar  //given

因此,如果您想int -> bar工作,请添加另一个构造函数int到 class bar

于 2013-02-16T21:24:58.203 回答
0

§ 13.3.3.1.2/1 关于隐式用户定义转换序列的要求:

用户定义的转换序列由初始标准转换序列和用户定义的转换 (12.3) 和第二个标准转换序列组成。如果用户定义的转换由构造函数 (12.3.1) 指定,则初始标准转换序列将源类型转换为构造函数参数所需的类型。如果用户定义的转换由转换函数 (12.3.2) 指定,则初始标准转换序列会将源类型转换为转换函数的隐式对象参数。

这意味着不可能链接多个用户定义的转换。

于 2013-02-16T21:34:40.217 回答