为什么模板化的用户定义转换操作符能够确定其返回类型?
Why is a templated user-defined conversion operator able to determine its return type?
如标题所述,为什么这是可能的?通常,模板化函数无法确定其返回类型,如果它不在输入参数中并且没有特别说明。例如:
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' ")
相关文章:
- 如何获取std::result_of函数的返回类型
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- C++中函数的向量返回类型引发错误
- 检查函数返回类型是否与STL容器类型值相同
- 为什么返回类型中需要typename?C++
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么模板化的用户定义转换操作符能够确定其返回类型?
- c++模板操作符重载不同类型,自动返回类型
- 赋值操作符的返回类型是什么?
- 重载操作符返回类型
- 如果在调用时没有取赋值操作符的返回类型,将会发生什么?
- 操作符++的正确返回类型
- 使用带有转换操作符的temp. proxy模拟返回类型的类型推导