在 C++ 中的关键字参数的聚合初始化中使用指定的初始值设定项是否可以?
Is it okay to use designated initializers in aggregate initialization for keyword arguments in C++?
简介
在函数调用中使用名称参数可以让开发人员更容易理解代码。
它似乎在 C++ 中并不普遍。是吗?
例子
首先,我想用例子来说明我的意思。
在Python中,我们可以像这样使用关键字参数
def f(x, y):
return x + y
f(x=1, y=2)
在 JS 中我们有一个解构
function f({x, y})
{
return x + y;
}
f({x: 1, y: 2})
愿望
在 C++20 中有一个称为指定初始化器的特性。这些可以用来显式地写参数的名字,虽然有一个问题:匿名结构不能用作像这样的参数类型
int f(struct { int x; int y; } args)
{
return args.x + args.y;
}
f({.x = 1, .y = 2});
所以,我应该使用
struct f
{
int x;
int y;
};
int f(struct f args)
{
return args.x + args.y;
}
f({.x = 1, .y = 2});
我可以使用联合来系统化文件中函数的参数用法
union Arguments
{
struct f
{
int x;
int y;
};
};
int f(struct Arguments::f args)
{
return args.x + args.y;
}
f({.x = 1, .y = 2});
这样的代码可以吗,还是最好不要使用名称并记住所有函数的签名?
对于普通函数参数,如果您不为函数参数提供初始值设定项,则会出现编译器错误。而使用 聚合初始化 缺少的成员是值初始化的。因此,这两种传递函数参数的方法在编译时检查是否显式提供了所有函数参数方面并不等效。
此外,单个函数参数更有可能在寄存器中传递,而只有小尺寸的结构才能在寄存器中传递。换句话说,将函数参数打包到结构中会使调用效率降低。
简介
在函数调用中使用名称参数可以让开发人员更容易理解代码。 它似乎在 C++ 中并不普遍。是吗?
例子
首先,我想用例子来说明我的意思。
在Python中,我们可以像这样使用关键字参数
def f(x, y):
return x + y
f(x=1, y=2)
在 JS 中我们有一个解构
function f({x, y})
{
return x + y;
}
f({x: 1, y: 2})
愿望
在 C++20 中有一个称为指定初始化器的特性。这些可以用来显式地写参数的名字,虽然有一个问题:匿名结构不能用作像这样的参数类型
int f(struct { int x; int y; } args)
{
return args.x + args.y;
}
f({.x = 1, .y = 2});
所以,我应该使用
struct f
{
int x;
int y;
};
int f(struct f args)
{
return args.x + args.y;
}
f({.x = 1, .y = 2});
我可以使用联合来系统化文件中函数的参数用法
union Arguments
{
struct f
{
int x;
int y;
};
};
int f(struct Arguments::f args)
{
return args.x + args.y;
}
f({.x = 1, .y = 2});
这样的代码可以吗,还是最好不要使用名称并记住所有函数的签名?
对于普通函数参数,如果您不为函数参数提供初始值设定项,则会出现编译器错误。而使用 聚合初始化 缺少的成员是值初始化的。因此,这两种传递函数参数的方法在编译时检查是否显式提供了所有函数参数方面并不等效。
此外,单个函数参数更有可能在寄存器中传递,而只有小尺寸的结构才能在寄存器中传递。换句话说,将函数参数打包到结构中会使调用效率降低。