以下代码无法编译;g++ 7.3.0 with--std=c++17
给出错误信息
constexpr 函数 'constexpr const C operator+(const C&, int)' 的无效返回类型 'const C'
注意:'C' 不是文字,因为 'C' 有一个非平凡的析构函数
#include <string>
using namespace std ;
struct C
{
C (std::string s) : s (s) { }
std::string s ;
} ;
constexpr const C operator+ (const C& x, int y) // <-- Error here
{
return C ("C int") ;
}
int main()
{
C c ("abc") ;
printf ("%s\n", (c + 99).s.c_str()) ;
}
好吧,好吧。但是,如果我将看似无关的模板规范添加到operator+
:
template<typename T>
constexpr const C operator+ (const C& x, T y)
{
return C ("C T") ;
}
然后它编译并运行,C T
按预期打印。
这里发生了什么?如果非平凡的析构函数是编译第一个的障碍,那么当同样的障碍存在时,它怎么能愉快地编译第二个呢?有没有一种很好的解决方法(即不使用template
黑客的方法)?我试过inline
但没有帮助。