使用没有定义 C++ 的函数是否合法?

Is it legal to use function with no definition c++?

我从该页面看到了一些代码片段 https://en.cppreference.com/w/cpp/types/result_of 并注意到了这个特定的函数模板签名类型:

template<class F, class... Args>
static auto call(F&& f, Args&&... args)
-> decltype(std::forward<F>(f)(std::forward<Args>(args)...));

注意:从给定的实现来看,根本没有定义,只指定了它的return类型。

如果可以的话,有哪些可能的应用程序可以用于此?

是的,这是允许的。 decltype 是一个未评估的上下文,因此实际上并未调用该函数,只是确定了它的 return 类型。以 std::declval 为例。它是标准声明的函数模板,只允许在未计算的表达式中使用,因为它可能没有定义。

我喜欢调用这些类型的函数元函数。您可以像使用类型特征一样使用它们,或者将它们用作构建模板代码类型的助手。前几天我在一个答案中使用了一个,它被用来帮助将一种类型的元组转换为另一种类型。看起来像

template <template <typename> typename Transformer, typename... Ts> 
auto transform_types(std::tuple<Ts...>) -> std::tuple<typename Transformer<Ts>::type...>;

我用它来构建一个像

这样的类型
template <template <typename> typename Transformer, typename Tuple>
using transform_types_t = decltype(transform_types<Transformer>(std::declval<Tuple>()));

这里是 link 到那个 post 如果你想看完整的例子: