Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 c++;11带尾随返回类型的typedef函数指针_C++11_Function Pointers_Typedef_Trailing Return Type - Fatal编程技术网

C++11 c++;11带尾随返回类型的typedef函数指针

C++11 c++;11带尾随返回类型的typedef函数指针,c++11,function-pointers,typedef,trailing-return-type,C++11,Function Pointers,Typedef,Trailing Return Type,我一直在尝试清理继承的代码库。它广泛使用了包含尾部返回类型的模板函数。它还包括许多指向非模板、非成员函数的函数指针。在清理过程中,我发现代码相当于Visual Studio 2013下的以下工作: #define function typedef auto function Kernel (int, int) -> int; struct Transform { Kernel* kernel; char* description; }; Transform add

我一直在尝试清理继承的代码库。它广泛使用了包含尾部返回类型的模板函数。它还包括许多指向非模板、非成员函数的函数指针。在清理过程中,我发现代码相当于Visual Studio 2013下的以下工作:

#define function typedef auto

function Kernel (int, int) -> int;

struct Transform
{
    Kernel* kernel;
    char*   description;
};

Transform add_transform { add, "add" };
这个typedef在C++11标准中有效吗


虽然我个人避免使用类似瘟疫的定义(特别是用于创建新的语言功能,如“函数”),但考虑到项目中尾部返回类型的普遍性,团队认为这将使代码库更具可读性。

尾部返回类型语法在C++11中是新的,它在任何可以编写函数类型的地方都是有效的
auto()->
只是一种奇特的书写方式
()
(其优点是
可以参考


这意味着
typedef自动内核(int,int)->int
是完全有效的,其含义与
typedefint内核(int,int)完全相同。然后,可以在函数的声明中使用TyWIFF,或者使用函数指针。使用/MUP>可以很容易地使用宏重新创建C++语法。你可能会想出这样一个很酷的主意,然后想“哇,这太清楚了”

<> P>这个方法最根本的问题是它对创建宏的人来说是更可读的,或者如果你不太了解C++的话。如果您完全理解了
typedef auto fn(int)->int
的含义,那么您将发现宏不再有用。语法已经足够清晰了


为了使事情复杂化,您引入了大量宏问题。您正在全面劫持
函数
符号名称-无论范围如何。现在您不能再使用
std::function
。您不仅不能使用它,而且它还会抛出一些糟糕的编译器错误,这些错误根本不是描述性的。编译器将试图解析
std::typedef auto
,这是胡说八道。

这是有效的,因为
auto(int,int)->int
是一个函数声明符,只是它缺少一个名称。名称
Kernel
,是
typedef
说明符用于创建类型名称的标识符。由于存在尾随返回类型,
auto
int
替换,它变为
int(int,int)
。如果你想让你的团队相信它是徒劳的,那么考虑一下你可以达到相同语法的方法:

using Kernel = int(int, int);
using Kernel = auto(int, int) -> int;
typedef auto Kernel(int, int) -> int;

它们在语义上都是等价的,避免使用宏

typedef自动内核(int,int)->int是合法的。尽管如此,我还是喜欢尝试将
std::function
与该宏一起使用。我完全同意——不幸的是,我的团队不同意!我希望它依赖于编译器,这样我就可以阻止他们使用它更可读,实际上是有效的C++语法。<代码>使用内核= Auto(int,int)-int;
也是有效的,但是在这一点上你可以看出这是多么愚蠢。
#define
看起来更像是一个出错的恶作剧。感谢你确认它在c++11中是合法的。事实上我很喜欢typedef auto。。。形式,因为它符合我的数学背景。也就是说,我讨厌#定义,我希望情况不会如此。