gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:31 30 4
gpt4 key购买 nike

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

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 [转换函数]:

A member function of a class X having no parameters with a name of the form

  • conversion-function-id:
    • operator conversion-type-id
  • conversion-type-id:
    • type-specifier-seq conversion-declarator opt
  • conversion-declarator:
    • ptr-operator conversion-declarator opt

specifies a conversion from X to the type specified by the conversion-type-id. Such functions are called conversion functions. No return type can be specified.


注意:

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

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

然后你会得到一个编译器错误(gcc gives "return type specified for 'operator T' ")

关于c++ - 为什么模板化的用户定义转换运算符能够确定其返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25123709/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com