考虑this code:
#include <iostream>
#include <typeinfo>
using namespace std;
template<typename T1, typename T2>
auto add(T1 l, T2 r) -> decltype(l + r){
return l + r;
}
class C {};
class B {};
class A {
public:
C operator+(const B& b) {
C c;
return c;
}
};
int main() {
// Using add()
A a;
B b;
auto c = add(a, b);
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
cout << endl;
// Doing the same thing but not on a function
A a2;
B b2;
auto c2 = a2 + b2;
cout << typeid(a2).name() << endl;
cout << typeid(b2).name() << endl;
cout << typeid(c2).name() << endl;
}
我只是有一个非常简单的问题:为什么我需要将decltype()放在postfix返回类型的add()中,这与第二种方法(不使用add()的方法不同)?
解决方法:
why do I need to put decltype() in the postfix return type of add() unlike in the second method (the one that doesn’t use add())?
因为这是C规则的一部分.解析器从左到右运行;在大多数情况下,如果尚未达到标识符,则解析器不知道它.标识符如函数参数.
因此,如果使用表达式来确定返回值的类型,并且该表达式以某种方式使用参数,则必须将返回类型放在函数参数之后.
But my point is, why can’t the compiler automatically deduce the return type when it knows that A + B returns C?
因为这些是C的规则:函数必须具有直接在函数声明中指定的返回类型.不允许编译器推导出它.