复制初始化 - 从 'int' 类型转换为非标量类型



我想知道如何定义类my_int以便从 int 到std::complex< my_int >的强制转换由编译器完成,而不是由我手动完成。

如果 4 未转换为 "my_int",则以下程序不会编译

// Example program
#include <iostream>
#include <string>
#include <complex>
struct my_int
{
my_int() : _i(0) {}
my_int(const my_int& mi) : _i(mi._i) {}
my_int(int i) : _i(i) {}
operator int(){return _i;}
int _i;
};
std::ostream& operator<<(std::ostream& os, const my_int& mi)
{
os << mi._i;
return os;
}
int main()
{
std::complex<my_int> ci = 4; // Casting 4 to my_int works
std::cout << ci;
}

我知道如果你用std::complex<my_int> ci(4)初始化ci它可以工作,但我希望它适用于副本初始化。

您可以定义复杂的类并以这种方式编写构造函数。

Complex(int re, int im = 0);

在这种情况下,编译器将隐式地将 int 转换为复数

Complex c = 5;

表面上的问题是,在复制初始化上下文中不允许多个用户定义的转换,可以通过使用直接初始化上下文来解决,例如

std::complex<my_int> ci{4}; 

但是,还有另一个隐藏的问题:为除floatdoublelong double以外的任何类型实例化模板复合体的效果是未指定的,因此您必须明确地对其进行专门化,正如 StoryTeller 在评论中指出的那样。

相关内容

最新更新