问题标签 [return-type-deduction]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
60340 浏览

c++ - 什么时候应该使用 C++14 自动返回类型推导?

随着 GCC 4.8.0 的发布,我们有了一个支持自动返回类型推断的编译器,它是 C++14 的一部分。使用-std=c++1y,我可以这样做:

我的问题是:我应该什么时候使用这个功能?什么时候需要,什么时候让代码更干净?

方案 1

我能想到的第一个场景是尽可能的。每个可以这样写的函数都应该是。这样做的问题是它可能并不总是使代码更具可读性。

方案 2

下一个场景是避免更复杂的返回类型。作为一个非常简单的例子:

我不相信这真的会成为一个问题,尽管我想在某些情况下让返回类型显式地依赖于参数可能会更清楚。

方案 3

接下来,为了防止冗余:

在 C++11 中,我们有时可以只return {5, 6, 7};代替向量,但这并不总是有效,我们需要在函数头和函数体中指定类型。这纯粹是多余的,而自动返回类型扣除使我们免于这种冗余。

方案 4

最后,它可以用来代替非常简单的函数:

但是,有时我们可能会查看函数,想知道确切的类型,如果那里没有提供它,我们必须转到代码中的另一个点,比如pos_声明的位置。

结论

列出了这些场景,其中哪些实际上被证明是该功能有助于使代码更清晰的情况?我在这里没有提到的场景呢?在使用此功能之前我应该​​采取哪些预防措施,以免它以后咬我?如果没有它,这个功能有什么新东西是不可能的吗?

请注意,多个问题旨在帮助找到回答这个问题的观点。

0 投票
2 回答
921 浏览

c++ - 使用私有成员变量的返回类型推导

正如昨天的问答中所解释的那样,g++ 4.8 和 Clang 3.3 都正确地抱怨下面的代码,并出现类似“'b_' is not declared in this scope”这样的错误

private部分移动到类定义的顶部会消除错误并打印 0。

我的问题是,这个错误是否也会在 C++14 中通过 return type deduction 消失,以便我可以在类定义的末尾省略decltypeand部分?private

注意:它实际上是基于@JesseGood 的回答。

0 投票
1 回答
2279 浏览

c++ - 类内友元函数的返回类型推导

这是一个关于类内朋友函数的返回类型推导的小实验(在两种情况下都使用 Clang 3.4 SVN 和 g++ 4.8.1 std=c++1y),链接的工作文件中没有记录

活生生的例子

问题:C++14 支持类内友元函数的自动返回类型推导吗?

0 投票
2 回答
784 浏览

c++ - 即使 XZY 具有非复制约束,构造助手 make_XYZ 也允许 RVO 和类型推导

UPDATE1: C++17 为构造函数添加了类型推导——这并不意味着 free 函数是一个劣质的解决方案。

UPDATE2: C++17 增加了保证复制省略(复制在概念上甚至不发生)。因此,使用 C++17,我的代码实际上可以工作并且具有最佳性能。但是我相信 Martinho 的代码使用大括号初始化返回值仍然是更干净的解决方案。但是请查看Barry 的这个答案和 TC 的评论

旧帖子:类型推导不适用于构造函数(至少在 C++11 之前并包括在内)。常见的解决方案是依靠 RVO(返回值优化),编写一个 make_XYZ 模板函数,将其参数转发给构造函数。一个例子是std::make_tuple

任何模板 acrobat 知道在 nocopy 策略妨碍时使这项工作正常工作的解决方法吗?一个有效的解决方案必须仍然允许 RVO 发生。

此外,任何 make_XYZ 的要求会随着 C++14 消失吗?

0 投票
1 回答
922 浏览

c++ - 使用尾随返回类型定义的函数的 Doxygen 行为

doxygen 版本 1.8.2的变更日志表示已将支持添加到 C++11 尾随返回类型。但是,使用 doxygen 版本 1.8.4 解析我的代码会导致返回类型是auto而不是尾随返回类型。

是否需要设置任何选项才能使其正常工作?

编辑:

在下图中,可以看出返回类型是auto,我认为这不是正确的行为。

在此处输入图像描述

0 投票
1 回答
359 浏览

c++ - 类方法的返回类型推导?C++1y

c++14 中的成员函数是否允许返回类型推导,还是只允许自由函数?

我问是因为我隐含地假设它会起作用,但是在 gcc 4.8.1 中我得到一个内部编译器错误(“in gen_type_die_with_usage”)。我第一次遇到这样神秘的错误,所以我有点怀疑;我知道他们从那时起改变了规范。

为清楚起见,这对我有用:

但这不是:

这在标准草案中是否允许?

0 投票
2 回答
1268 浏览

c++ - CRTP和c++1y返回类型推导

我最近在玩 CRTP,当我在使用 c++1y 类型推断的函数时遇到了一些令我惊讶的事情。以下代码有效:

我假设 from 的返回类型Base<Derived>::foodecltype返回的表达式的 a ,但是如果我像这样修改函数foo

此代码不再起作用,我收到以下错误(来自 GCC 4.8.1):

我的问题是:为什么它不起作用?在不依赖自动返回类型扣除的情况下,我可以写什么来获得正确的返回类型?

而且,嗯……这是一个活生生的例子

0 投票
4 回答
6891 浏览

c++ - 在调用函数之前如何推断 auto ?

0 投票
0 回答
275 浏览

c++ - gcc 4.8(C++1y/C++14)中是否有IDE支持“返回类型推导”并自动补全?

喜欢

我发现 Netbeans 7.4 和 Eclipse 4.2 还不支持这个特性。

0 投票
1 回答
1008 浏览

c++ - 具有推导的 void 返回类型的 Constexpr 类模板成员函数?

考虑以下简单的类X和类模板Y<T>,每个成员定义了四个constexpr成员,其中三个具有推导的返回类型(新的 C++1y 特性),以及利用另一个新的 C++1y 特性的三个子集:轻松的constexpr现在也可以有副作用和void返回类型的函数。

下面是这些功能交互的小实验:

仅在 Clang >= 3.4 上编译的实时示例(因为它是唯一同时支持自动返回类型推导和宽松constexpr函数的编译器)

gun()类模板内的函数Y<T>(但不在类内X)会产生编译器错误:

constexpr 函数中没有返回语句

问题:根据标准,在类模板中将constexpr函数与自动推导的void返回类型组合是不可能的,还是 Clang 中的编译器错误?