[英]C++ copy initialization + implicit constructor call = fail
这段代码:
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和-fstd=gnu++11
):
error: conversion from 'int' to non-scalar type 'bar' requested
但是,我提供了一个使用foo
的bar
构造函数,并且可以将ints隐式转换为foo
如其前一行所示。 那么,出了什么问题?
顺便说一下,由于多种原因,不希望使用foo(3)
强制转换为foo
因为那样会使我的实际代码难以使用和读取。
我提供了一个带有foo的bar构造函数,并且可以将ints隐式转换为foo,如其前一行所示。 那么,出了什么问题?
在C ++中不允许链式转换,这意味着(链式)转换不会发生:
int -> foo -> bar //not allowed (chained conversion)
即使给出以下内容:
int -> foo //given
foo -> bar //given
因此,如果您要让int -> bar
正常工作,请在bar
类中添加另一个使用int
构造函数。
第13.3.3.1.2 / 1条关于隐式用户定义的转换序列的规定:
用户定义的转换序列由初始的标准转换序列,后面的用户定义的转换(12.3)和第二个标准转换序列组成 。 如果用户定义的转换是由构造函数(12.3.1)指定的,则初始标准转换序列会将源类型转换为构造函数的参数所需的类型。 如果用户定义的转换是由转换函数(12.3.2)指定的,则初始标准转换序列会将源类型转换为转换函数的隐式对象参数。
这意味着不可能链接多个用户定义的转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.