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

Why is a templated user-defined conversion operator able to determine its return type?

本文关键字:返回类型 操作符 转换 定义 用户 为什么      更新时间:2023-10-16

如标题所述,为什么这是可能的?通常,模板化函数无法确定其返回类型,如果它不在输入参数中并且没有特别说明。例如:

class Foo {
public:
    template<typename T>
    operator T() { return T(); }
};
int main() {
    Foo instance;
    int someInteger = instance;
    return 0;
}
即使没有在任何地方显式声明返回类型,

编译和运行也不会出现任何问题。用户定义的转换操作符是否与模板规则有某种特殊关系?

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

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

template <class T>
T sizeGetterFun()
{
    return std::numeric_limits<T>::max();
}
int main() {
    int maxInt = sizeGetterFun();
    double maxDouble = sizeGetterFun();    
    return 0;
}

这是有效的,并且实现了从无效代码请求的相同的事情。

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;
}

为什么编译器不能在不需要实现转换操作符的虚拟类的情况下自动推断返回类型?在使用第二个(工作)示例时,是否会遇到任何问题?

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


c++标准节§12.3.2[转换函数]:

类X的成员函数,没有形参,其名称为形式

  • conversion-function-id:
    • 操作转换类型-id
  • conversion-type-id:
    • 类型指定符-序列转换声明器
  • conversion-declarator:
    • ptr-operator转换声明器opt

指定从X到指定类型的转换conversion-type-id。这样的函数称为转换函数。不能指定返回类型


注意:

如果你试图显式一个返回类型,例如:

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

Then you'll get a compiler error (gcc gives "return type specified for 'operator T' ")