繁体   English   中英

关于c ++ 11中的std :: result_of

[英]about std::result_of in c++11

据我所知, std::result_of的可能实现是

template<class F, class... ArgTypes>
struct result_of<F(ArgTypes...)>
{
    typedef decltype(
        std::declval<F>()(std::declval<ArgTypes>()...)
        ) type;
};

但是当我使用std::result_of我遇到了一些麻烦。

int f(int x)
{
    return 0;
}

template<typename T>    
void Test(const T& t)
{
    decltype(std::declval<T>()(std::declval<int>())) i1 = 1; // ok
    typename std::result_of<T(int)>::type i2 = 2; // compile error:
    // function returning a function
    // I think this means the same thing just as above, right?
}

int main()
{
    Test(f);
    return 0;
}

这两种形式有什么区别?

std::result_of在C ++ 11中声明[meta.trans.other]表57如下:

template <class Fn, class... ArgTypes> struct result_of<Fn(ArgTypes...)>;

它要求:

Fn应为可调用类型(20.8.1),对函数的引用或对可调用类型的引用。 表达方式

 decltype(INVOKE(declval<Fn>(), declval<ArgTypes>()...)) 

应该很好。

可调用类型在[func.def] / 3中定义:

可调用类型是函数对象类型(20.8)或指向成员的指针。

函数对象类型在[function.objects] / 1中定义:

函数对象类型是对象类型(3.9),它可以是函数调用中的postfix-expression的类型(5.2.2,13.3.1.1)。 ...

在你的程序中, f是对int(int)类型函数的引用,因此T被推导为函数类型int(int) 请注意,函数类型不是要传递给std::result_type的类型Fn的有效选项之一。 对函数的引用可接受的类型,但是:您应该将完整类型的Test s参数传递给result_of而不是仅传递给T在Coliru演示 ):

template<typename T>    
void Test(const T&)
{
    decltype(std::declval<T>()(std::declval<int>())) i1 = 1;
    typename std::result_of<const T& (int)>::type i2 = 2;
}

关于两种形式之间的区别,请记住std::declval总是返回一个引用类型; 特别是std::declval<T>()返回T&& 所以

decltype(std::declval<T>()(std::declval<int>()))

要求使用int&&参数调用T&&时返回什么类型。

[basic.compound]描述了C ++中的函数类型:

- 功能 ,其具有给定的类型的参数和返回void或引用或物体上的给定类型的

因此,函数类型的返回类型部分本身不能是函数类型,因此当T = int(int)时, T(int)不是C ++类型系统中的有效类型。

此外,[dcl.fct] / 8澄清:

函数不应具有类型数组或函数的返回类型

另请注意, i1行的实际模拟是typename std::result_of<T>::type i2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM