为什么用户定义的转换函数模板不能具有推导的返回类型?

cin*_*ter 4 c++

遵循以下规则的原因是:“用户定义的转换函数模板不能具有推论的返回类型。”

struct S {
  operator auto() const { return 10; } // OK
  template<class T> operator auto() const { return 42; } // error
};
Run Code Online (Sandbox Code Playgroud)

xry*_*669 11

即使允许,在第二行中,也没有任何内容取决于模板。它不能被调用(T在这种情况下,目的是什么?)

如果要转换为用户定义的类型,则可以这样做:假设您具有:

struct S
{
   template<typename T> operator T() { return T(42); }
};
Run Code Online (Sandbox Code Playgroud)

很明显,没有必要推论任何东西。您可以这样称呼:

S s;
int v = s;
float f = s;
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,在上面的代码中使用auto而不是float会阻止编译器推断类型(是float?an int?an Orange?)。上面的句子只是说明了这一点。