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

时间:2018-05-14 10:26:56

标签: c++ c++11 templates c++14 copy-initialization

我想知道如何定义类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;
}

我知道如果您使用ci初始化std::complex<my_int> ci(4)它可以正常工作,但我希望它可以用于复制初始化。

2 个答案:

答案 0 :(得分:2)

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

  Complex(int re, int im = 0);

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

上的complex
Complex c = 5;

答案 1 :(得分:1)

看似问题是more than one user-defined conversion is not allowed in the copy-initialization context,它可以通过使用直接初始化上下文来解决,例如

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

然而,还有一个隐藏的问题:the effect of instantiating the template complex for any type other than float, double or long double is unspecified,所以你必须明确地专门化它,正如StoryTeller在评论中指出的那样。