为什么模板化的用户定义转换运算符能够确定其返回类型?

Sil*_*ter 6 c++ templates type-conversion

如标题所述,为什么这可能?通常模板化的函数如果不在输入参数中并且未明确说明,则无法确定它们的返回类型.例如:

class Foo {
public:
    template<typename T>
    operator T() { return T(); }
};

int main() {
    Foo instance;
    int someInteger = instance;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译并运行没有任何问题,即使返回类型未在任何地方明确说明.用户定义的转换运算符在模板规则方面是否有些特殊?

我意识到它在语法上不是返回类型.尽管如此,它在语义上是.毕竟,它是运算符返回的对象类型.

编辑:问题应该是"为什么模板化函数不能确定它们的返回类型?" 这是无效的:

template <class T>
T sizeGetterFun()
{
    return std::numeric_limits<T>::max();
}

int main() {
    int maxInt = sizeGetterFun();
    double maxDouble = sizeGetterFun();    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,并且与无效代码请求的内容相同.

class Foo {
public:
    template<typename T>
    operator T() 
    { 
        return std::numeric_limits<T>::max();
    }
};

Foo sizeGetterFun()
{
    return Foo();
}

int main() {
    int maxInt = sizeGetterFun();
    double maxDouble = sizeGetterFun();    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么编译器不能自动推导出返回类型而不需要实现转换运算符的虚拟类?使用第二个(工作)示例时是否会遇到任何问题?

qua*_*dev 5

因为您声明了转换函数(模板).转换函数没有返回类型,因为它是转换函数,它必须返回一个T.


C++标准部分§12.3.2[转换函数]:

类X的成员函数,没有带有表单名称的参数

  • 转换功能ID:
    • operator convert-type-id
  • 转换型-ID:
    • type-specifier-seq conversion-declarator opt
  • 转换说明符:
    • ptr-operator conversion-declarator opt

指定从X到convert-type-id指定的类型的转换.这些功能称为转换功能.不能指定返回类型.


注意:

如果您尝试显式返回类型,例如:

class Foo {
public:
    template<typename T>
    int operator T() { return T(); }
};
Run Code Online (Sandbox Code Playgroud)

然后你会得到一个编译器错误(gcc给出" 为'运算符T'指定的返回类型 ")