我确实理解在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 ++中是不允许的?编译器能否看到两个函数之间的区别?还有其他办法吗?
答案 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));
}