【问题标题】:What is the status of abbreviated functions in C++? [duplicate]C++中缩写函数的状态如何? [复制]
【发布时间】:2015-01-07 11:57:16
【问题描述】:

C++中缩写函数的状态如何?环顾四周,我在 C++ 概念的working draft 中看到了一些提及。同时,GCC 之类的代码似乎没有问题

#include <iostream>

auto foo(auto x) {
    std::cout << x << std::endl;
}

int main() {
    foo(1);
    foo(1.2);
}

现在,如果我使用 -Wpedantic 进行编译,我会收到警告:

g++ -std=c++14 -Wpedantic test08.cpp -o test08
test08.cpp:3:9: warning: ISO C++ forbids use of 'auto' in parameter declaration [-Wpedantic]
 auto foo(auto x) {
         ^

这告诉我缩写函数并不完全符合标准。因此,它们在 C++ 标准和常见 C++ 编译器方面的现状如何?

【问题讨论】:

  • 不,C++14 标准中没有这样的东西。您甚至可以在a draft of the standard 中检查自己。
  • 这将由概念 TS 添加。请注意,它还允许您编写像 auto foo(std::vector&lt;auto&gt; const&amp; v) 这样的东西 - 毕竟模板参数推导和 auto 的规则是相同的 - 模初始化列表。
  • 您似乎回答了自己的问题:它们不在当前标准中,但在概念提案中。
  • 曾经有一个“过于本地化”的密切原因,因此这个问题应该关闭。没有可以接受的明确答案; “当前状态”可能因每次 WG21 会议而异。
  • @MSalters:我不知道这是否完全公平。基本上,我试图了解这是否只是 GCC 中的一个扩展,或者它是否计划成为 C++17 或更高版本的标准。是的,情况可能会发生变化,但我不确定目前情况如何。

标签: c++ c++14 c++17


【解决方案1】:

我认为您要问的是缩写函数模板。您链接到的文档以这种方式定义它:

如果 auto 类型说明符出现在函数声明的参数类型中,则函数声明声明了一个缩写函数模板。示例:void f(const auto&amp;, int);

这个例子的意思是:

template <typename T>
void f(const T&, int);

C++14 标准得到generic lambdas。示例:auto lambda = [](auto x, auto y) {return x + y;}; 但是我还没有看到任何说“通用 lambda”功能将扩展到传统功能的消息。

Technical Report 1不同,Technical Report 2将作为单独的技术规范发布:Is TR2 Going to be Released in C++17?

似乎概念技术规范的下一个障碍尤其是WG21 Concepts Meeting

您可以在此处阅读有关概念技术规范的更多信息:http://en.wikipedia.org/wiki/Concepts_%28C%2B%2B%29

【讨论】:

  • 跨栏已过,投票结束
  • @Cubbi 非常感谢您的更新!我在看阵列扩展技术规范here你有没有机会知道那个人的状态?
【解决方案2】:

看起来您正在尝试创建一个模板化函数,至少看起来您需要一个 :)

template <typename X>
void foo(X x) {
    std::cout << x << std::endl;
}

这将在编译时扩展,编译器应该如何知道auto 应该解释为哪种类型?在您的示例中,您使用两种不同的类型。

请注意,虽然您没有在函数内返回任何内容,但仍使用 auto 作为返回类型。

【讨论】:

  • 编译器会像使用多态 lambda 时一样知道类型:通过将 foo() 转换为函数模板 :)
  • 是的,问题中的缩写函数模板等同于该模板(auto 就像模板参数一样推导出来,因为它已经在 C++14 多态 lambda 中)。但是您还没有回答这个问题:它们在 C++ 标准和常见 C++ 编译器方面的现状如何?
  • 当我阅读当前草稿时,我一定错过了那部分:):github.com/cplusplus/concepts-ts/blob/master/html/concepts.pdf 它距离准备就绪还有很长的路要走,所以最早是 C++17。但老实说,我相信其他人有更准确的答案:)
猜你喜欢
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 2020-04-22
  • 2017-01-18
  • 1970-01-01
相关资源
最近更新 更多