问题 C ++ 11中是否有新的函数类型表达式格式?


今天我退房了 Stroustrup的C ++ 11常见问题解答 (2013年4月7日修改)并在类型别名部分的末尾看到了这一点:

typedef void (*PFD)(double);    // C style
using PF = void (*)(double);    // using plus C-style type
using P = [](double)->void;     // using plus suffix return type

其中lambda介绍器用于启动使用后缀样式返回类型的通用函数类型表达式。这是官方的,还是掉线的测试/愿望清单功能?如果它是官方的,它对非静态成员函数有什么作用?


7329
2018-04-30 03:41


起源



答案:


using P = [](double)->void;

不是官方的。众所周知,Bjarne在他的常见问题解答中有点粗心。

但是,工作原理如下:

using P1 = auto(double) -> void;
using P2 = auto(*)(double) -> void;

哪里 P1 是一个函数类型,和 P2 是一个函数指针类型。也许那是他的意图。


11
2018-04-30 06:30



所以Bjarne的第三个条目是利用stateless-lambda = to = regular-function conversion,对吧?在阅读本文之前,我进行了实验并发现“auto (MyClass::*)(Whatever) CV -> ReturnType“有效。 - CTMacUser
@CTMacUser:不,不。 using 期待一种类型, [](stuff)->stuff 是一个不完整的lambda对象。是的,这是语法,就像普通的成员函数指针一样,除了尾随的返回类型。 - Xeo


答案:


using P = [](double)->void;

不是官方的。众所周知,Bjarne在他的常见问题解答中有点粗心。

但是,工作原理如下:

using P1 = auto(double) -> void;
using P2 = auto(*)(double) -> void;

哪里 P1 是一个函数类型,和 P2 是一个函数指针类型。也许那是他的意图。


11
2018-04-30 06:30



所以Bjarne的第三个条目是利用stateless-lambda = to = regular-function conversion,对吧?在阅读本文之前,我进行了实验并发现“auto (MyClass::*)(Whatever) CV -> ReturnType“有效。 - CTMacUser
@CTMacUser:不,不。 using 期待一种类型, [](stuff)->stuff 是一个不完整的lambda对象。是的,这是语法,就像普通的成员函数指针一样,除了尾随的返回类型。 - Xeo


Lambda语法不能与非静态成员函数一起使用,因为指向函数的指针和指向成员的指针函数的实现方式不同。指向成员的函数不是常规指针。它不像常规指针那样保存“确切地址”。我们可以想象它保存了函数在类布局中的“相对地址”。

如果你需要在某处传递指向成员函数的指针,那么cosider std :: function用法。


0
2018-04-30 06:05



哦,我问的是这个问题的外观,而不是用法。 @Xeo的答案给了我我需要的东西。 - CTMacUser