c – 为什么在“自动返回”功能中需要decltype?

考虑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的规则:函数必须具有直接在函数声明中指定的返回类型.不允许编译器推导出它.

Yet.

上一篇:c – 模板,decltype和非classtypes


下一篇:根据设备宽高设置View的大小