为啥 C++ 不支持命名参数

Posted

技术标签:

【中文标题】为啥 C++ 不支持命名参数【英文标题】:Why C++ doesn't support named parameter [closed]为什么 C++ 不支持命名参数 【发布时间】:2016-10-30 19:33:36 【问题描述】:

以前,我使用 python。在 Python 中,我使用命名参数(关键字参数)进行函数调用。关于named parameter 的***页面告诉C++ 不支持它。为什么 C++ 不支持命名参数?是否支持未来版本的 C++ 标准?

【问题讨论】:

[FYI] 有一个提议:open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4172.htm 至少有一个提案给他们。您可以尝试了解为什么它不是标准的一部分。 这不是关于编程,而是关于一个决定。 @PaulR:我假设这里的上下文是“我想要命名参数”而不是“我需要命名参数”。 @Anonymous1847 hmmm idk,也许我遗漏了一些东西,但似乎在编译时完全解决并不难。当前有序参数必须在某处表示为类型的索引列表。将编译时枚举映射到那些。然后编译器可以根据常量值按索引重新排列命名参数。这应该允许简单的类型推导并避免对已编译代码进行任何更改。有效地作为别名工作 【参考方案1】:

为什么 C++ 不支持命名参数

因为标准中还没有引入这样的功能。该功能在 C 中也不存在(也不存在),而这正是 C++ 最初的基础。

在未来版本的 C++ 标准中是否支持?

也许吧。为它写了一个proposal。这取决于提案是否被投票纳入标准。


更新:提案已被拒绝。

C++ 的一个基本问题是函数声明中的参数名称不重要,并且下面的程序定义良好:

void foo(int x, int y);
void foo(int y, int x);   // re-declaration of the same function
void foo(int, int);       // parameter names are optional
void foo(int a, int b)  // definition of the same function

如果语言中引入了命名参数,那么这里会传递哪些参数?

foo(x=42, b=42);

命名参数需要显着不同且向后不兼容的参数传递系统。


您可以使用类类型的单个参数来模拟命名参数:

struct args 
    int   a = 42;
    float b = 3.14;
;

void foo(args);

// usage
args a;
a.b = 10.1;
foo(a);
// or in C++20
foo(.b = 10.1);

【讨论】:

以下是this page 对提案的看法:Discussed in Urbana. EWG found various problems with the proposed approach, and didn't think it's feasible to try solving the problem, as it has been tried many times and every time it has failed. CppCon 2018 Talk "Named Arguments from Scratch” by Richard Powell 可能有用。 我喜欢这个功能,它使代码清晰,在c++17中仍然没有这个功能 @Andrew They are supported now 不,他们不是。从您链接的文章中:C++ is obviously not such a language and there have been numerous proposals to rectify this omission, unfortunately none of them successful. 将所有参数作为单个类传递一直是实现类似目标的解决方法。使用指定的初始化器,它已成为真正命名参数的非常接近的模拟。 @Andrew They're real named parameters 不,他们不是。它们实际上是成员变量。 It's very convenient 虽然是这样,但这并不能使它们成为命名参数。 this serves the overall purpose and function of named parameters. 只有一部分。您可以使用单个类参数使您自己的函数模拟命名参数,但这不允许您将命名参数传递给未以这种方式声明的函数。

以上是关于为啥 C++ 不支持命名参数的主要内容,如果未能解决你的问题,请参考以下文章

jdbc为啥prepared statement不支持命名参数?

c++的重载 缺省参数和命名空间详解

C++:命名空间缺省函数以及函数的重载

C++入门语法第一篇:(命名空间缺省参数函数重载引用内联函数)

为啥 Perl CGI 模块使用连字符来开始命名参数?

C++命名空间与缺省参数