C++ 用户定义的文字运算符(constexpr构造函数)

C++ 用户定义的文字运算符(constexpr构造函数),c++,c++11,g++,clang,C++,C++11,G++,Clang,我正在实现一个类,它定义了一个复数,并带有可能的算术运算。现在,我正在尝试编写一个用户定义的文本运算符: constexpr Complex operator "" _i(long double arg) { return Complex{0.0, arg}; } 这让我可以写以下内容: Complex c = 1.0 + 5.0_i; 为此,我必须实现一个与之配套的constexpr构造函数: constexpr Complex(double real, double imagin

我正在实现一个类,它定义了一个复数,并带有可能的算术运算。现在,我正在尝试编写一个用户定义的文本运算符:

constexpr Complex operator "" _i(long double arg) {
    return Complex{0.0, arg};
}
这让我可以写以下内容:

Complex c = 1.0 + 5.0_i;
为此,我必须实现一个与之配套的constexpr构造函数:

constexpr Complex(double real, double imaginary) : re(real), im(imaginary) {};
其中re和im是成员变量。在g++中编译时,这很好,但在使用clang时,会出现以下错误:

error: constexpr function never produces a constant expression[-Winvalid-constexpr]
我做错什么了吗?g++的限制性比clang小吗

整个实施过程如下:

class Complex {
 private:
   double re;
   double im;
 public:
   // Class constructors
   Complex() : re(0.0), im(0.0) {};                      
   Complex(const double real) : re(real) {};
   constexpr Complex(const double real, const double imaginary) : re(real), im(imaginary) {};

/* All the overloaded functions etc. below */

};

constexpr Complex
operator "" _i(long double arg) {
  return Complex{0.0, arg};
}

我无法重现您的确切错误,但我能够理解为什么不是所有构造函数都是
constepr
?是运算符double+complexconstepr吗?在常量表达式中,缩小转换的格式不正确,尽管您提供的代码不会产生您显示的错误,因为
Complex{0.0,arg}
从长双精度缩小到双精度。