C ++ constexpr重载具有相同名称的构造函数

时间:2018-02-07 10:40:10

标签: c++ class overloading constexpr

我确实理解在constexpr上使用它时可以在运行时之前计算的表达式。

我想为复数创建一个constexpr。 x = 5_i应该创建一个我自己创建的复杂类的复数,并且要做到这一点我需要一个constantexpr constructor

class Complex {
private:
    double real_;
    double imag_;

public:
    ...
    Complex(double real, double imaginary);

    constexpr Complex(double real, double imaginary):
        real_(real),imag_(imaginary) {};

//Nonmember function
constexpr Complex operator""_i(long double arg);

{。{1}}稍后在.cpp文件中定义 当我尝试编译它时,我收到以下错误:

Complex(double real, double imaginary);

如果我只定义‘constexpr Complex::Complex(double, double)’ cannot be overloaded with ‘Complex::Complex(double, double)’ 函数,我的结论就是我不能在运行时使用constexpr

为什么我不能定义两个不同的功能?这在C ++中是不允许的?编译器能否看到两个函数之间的区别?还有其他办法吗?

2 个答案:

答案 0 :(得分:5)

即使您定义它constexpr,您仍然可以在运行时使用它。您不需要两个不同的重载,也不能只在constexpr上重载。

constexpr User-defined literals需要constexpr constructor,以便编译器可以在编译时创建和初始化类的对象。 constexpr构造函数对构造函数设置了一些限制,但允许constant initialization

constexpr Complex a = 1.0_i;
const Complex b = 1.0_i;

如果您查看std::complex,您会发现它还有constexpr个构造函数。

答案 1 :(得分:1)

我不会推出自己的复杂类型。把苦差事留给图书馆的作家,弯曲他们的键盘,就像中世纪僧侣复制手稿一样。

我不知道为什么运营商必须采用long double而不仅仅double,但这是法律。

#include <complex>
using Complex = std::complex<double>;

constexpr Complex operator"" _i (long double val) {
    return Complex(0.0,  static_cast<double>(val));
}