当前位置: 首页 > 知识库问答 >
问题:

为什么对模板参数使用decltype?

澹台俊晖
2023-03-14

在里面https://github.com/stlab/libraries/blob/main/stlab/concurrency/main_executor.hpp,我读到

struct main_executor_type {
    using result_type = void;

    template <typename F>
    void operator()(F f) const {
        using f_t = decltype(f);

        dispatch_async_f(dispatch_get_main_queue(), new f_t(std::move(f)), [](void* f_) {
            auto f = static_cast<f_t*>(f_);
            (*f)();
            delete f;
        });
    }
};

decltype(f)的意义是什么,为什么不直接使用f?

共有2个答案

范彭亮
2023-03-14

对于这个特定的代码示例,我看不到任何有用的场景(如果我错了,请纠正我),但如果参数被声明为cv限定的,则看起来会有所不同,例如,const F F。然后,使用f\u t=decltype(f)将计算为常数F,而使用F\u t=F进行计算将删除cv限定符并计算为F。

考虑以下简化示例以更好地理解:

#include <type_traits>

template <typename T>
void foo(const T t) {
    using X = decltype(t);
    static_assert(std::is_const_v<X>); // will fail if using X = T;
}

int main() {
    const int a = 123;
    foo(a); // T will be deduced to int, i.e. cv qualifiers are removed
}
计承德
2023-03-14

这取决于具体情况,因为有些情况会导致F和decltype(F)之间产生不同的效果。

例如,可以将F显式指定为数组或函数类型,函数参数的类型将调整为指针。然后,F和decltype(F)给出不同的结果。

template <typename F> // suppose F is specified as array of T or function type F
void operator()(F f) const {
    using f_t = decltype(f); // f_t will be pointer to T or pointer to F
    ...
}
 类似资料: