BackPort C 14返回类型扣除对C 11

Backport C++14 return type deduction to C++11

本文关键字:返回类型 BackPort      更新时间:2023-10-16

如何使此代码c 11符合?

template <class ...Args>
auto operator()(Args&&... args) const
{
    return _delegate(std::forward<Args>(args)...);
}

代码是模板结构的一部分。_delegate是一个成员,如下所示。

/// The implementation of the slot, as a delegate.  
typedef fastdelegate::FastDelegate<Signature> impl_delegate;    
impl_delegate _delegate;

可以在此处找到完整的文件。它是slot.hpp。https://github.com/miguelmartin75/wink-signals/tree/master/master/wink

您可以简单地添加 taild返回类型

template <class ...Args>
auto operator()(Args&&... args) const
    -> decltype(_delegate(std::forward<Args>(args)...))
{
    return _delegate(std::forward<Args>(args)...);
}

live wandbox示例

如果您的编译器在 taxting返回类型中抱怨_delegate,请尝试使用std::declval</* type of '_delegate' */>()


请注意,上面的代码可能与C 14的行为不同。考虑与以下成员函数超载的情况:

auto operator()(...) const { }

在C 14中,自动返回类型的扣除不是对SFINAE友好友好,因此问题中的原始功能可能会导致_delegate(std::forward<Args>(args)...)不正确而不是Sfinae-ing,可能会导致硬编译错误。

在C 11中,_delegate(std::forward<Args>(args)...)是签名的一部分 - 如果它不正确,其他过载也将有机会选择。

这是Wandbox上的实时示例。不注重线15查看更改。