在 C++14 中使用自动返回“类型”进行显式模板专业化是否有效?

2024-01-08

上一个问题 https://stackoverflow.com/questions/27629039/c-explicit-return-type-template-specialisation.

我重复上一个问题中的代码以使这个问题独立。如果使用 gcc 4.8.3 编译下面的代码,则可以编译并且不会发出任何警告。和-std=c++1y。但是,如果使用以下命令编译,它确实会发出警告-std=c++0x旗帜。在上一个问题的上下文中,有人指出该代码不能使用 gcc 4.9.0 进行编译。不幸的是,目前我还不完全明白如何auto已实施。因此,如果有人能回答以下问题,我将不胜感激:

1).下面的代码是否符合 C++14 标准的有效 C++?

2)。如果是,这段代码会被认为是一个好的风格吗?如果没有,为什么不呢?

3)。为什么下面的代码在使用 C++11 编译器时可以编译并工作(有时)?或者,为什么它并不总是有效?是否有任何特定的标志/选项/设置可能会阻止它工作?

template<int N> auto getOutputPort2();
template<> auto getOutputPort2<0>();
template<> auto getOutputPort2<1>();

template<>
auto getOutputPort2<0>()
{
    return std::unique_ptr<int>(new int(10));
}

template<>
auto getOutputPort2<1>()
{
    return std::unique_ptr<string>(new string("qwerty"));
}

1).下面的代码是否符合 C++14 标准的有效 C++?

是的,据我所知。有时有点难以证明,因为通常没有什么禁止它。但是,我们可以看一下最近的草案(N4296 后)中的一个示例,[dcl.spec.auto]/13:

template <typename T> auto g(T t) { return t; } // #1
template auto g(int);                           // OK, return type is int
template char g(char);                          // error, no matching template
template<> auto g(double);                      // OK, forward declaration with
                                                // unknown return type

同一段规定:

具有使用占位符类型的声明返回类型的函数或函数模板的重新声明或特化也应使用该占位符,而不是推导类型。

所以函数模板的显式特化must使用返回类型推导。 我找不到任何禁止不同专业的不同返回类型的内容。类似地,在 C++98 中,(同一主模板的)函数模板特化的不同返回类型可以通过使返回类型依赖于模板参数来实现。通过使用元编程,您基本上可以实现与使用返回类型推导为不同专业化指定不相关的返回类型时相同的效果。


3)。为什么下面的代码似乎可以(有时)使用 C++11 编译器进行编译和工作?

OP 中的代码在 C++11 中格式不正确。普通函数(非 lamda)的返回类型推导是 C++14 中引入的一项功能。包含此代码片段的程序是不规范的。然而,该标准并不强制执行(编译器)必须拒绝格式错误的程序。它仅在 [intro.compliance]/2.2 中指出:

如果程序包含违反任何可诊断规则的行为,则符合要求的实现应发出至少一条诊断消息。

和 /8

一致的实现可以具有扩展(包括附加的库函数),只要它们不改变任何格式良好的程序的行为。根据本国际标准,需要实施来诊断使用此类格式错误的扩展的程序。然而,这样做之后,他们就可以编译并执行此类程序。

(所以实现可以接受这个程序作为扩展.)

g++4.8.3 发出警告,该警告被视为诊断消息。 g++4.9 发出错误,这也是诊断消息。两者均符合规定。通过指定-Werror,你可以告诉 g++4.8.3 拒绝这个程序。 (您必须询问 gcc 开发人员为什么他们将其从警告更改为错误。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++14 中使用自动返回“类型”进行显式模板专业化是否有效? 的相关文章

随机推荐

  • 二进制响应内容,请求库

    我正在阅读有关请求库的文档 它似乎已经非常过时了 我一步一步尝试了其中显示的所有示例 并在尝试运行以下代码时遇到了问题 import requests from PIL import Image from StringIO import S
  • 现有 ASP.NET 4 解决方案中的高效 URL 屏蔽/伪装/隐藏

    我当前的系统使用 IIS 6 和 7 使用 ASP NET 和 NET 4 中的 C 编写 我的目的是完全隐藏网址 根据客户请求 IE https myapp it mydomain com Secure folder1 folder2 f
  • 正则表达式匹配 Perl 中字符串的第二次出现

    我正在尝试匹配 perl 中字符串的第一次和第二次出现 输入的前几行 包含在 intersect 中 是 gi 112807938 emb CU075707 1 Xenopus tropicalis finished cDNA clone
  • 无法打开活动:无法创建 Android 视图模型实例

    我正在创建一个应用程序来扫描条形码并使用 Android 视图模型和 LiveData 将该信息获取到房间数据库中 这是错误消息 java lang RuntimeException Unable to start activity Com
  • 将 Autofac 容器传递给 WPF UserControl

    我正在使用 autofac 来解析 WPF 应用程序中的视图和视图模型 IComponentContext 自动传递到视图中 一个例子 public BusinessAuto int proposedCoverageId IComponen
  • 如何从JSP下载附件文件

    我想知道如何根据内容配置从 JSP 页面下载任何文件依恋来自邮件服务器 我想在 JSP 页面上创建一个链接 通过单击该链接 用户可以从邮件服务器下载文件 该链接应该用于内容处置依恋类型 我怎样才能在 JSP 中做到这一点 不要为此使用 JS
  • Visual Studio 抱怨编译调试时找不到 .exe

    我有一个非常简单的 C 应用程序 include
  • Ruby 中的 Monad 等价物

    Ruby 中 monad 的等效构造是什么 精确的技术定义 在 Ruby 中 一个 monad 可以是任何带有以下内容的类 bind and self unit定义的方法使得对于所有实例 m m class unit a bind f f
  • 定制锂路由场景

    我的任务是用大量预先存在的链接目录重写现有网站 为了便于论证 我们假设我们无法执行任何会更改链接目录的操作 以下是我们正在使用的链接结构的一些示例 项目页面将是 www domain com widgets some totally awe
  • 为什么java语句评估会发生这样的情况?

    int z 1 System out println z z System out println z z 输出将是 false true 我不明白为什么 请向我解释一下 的操作数 从左到右评估 http docs oracle com j
  • 下拉列表依赖于另一个下拉列表 tkinter

    我有一个包含汽车品牌的列表 还有第二个包含这些品牌的型号名称的列表 我想要两个下拉列表 首先 您选择品牌 然后在第二个下拉列表中选择型号 但仅限于所选品牌的型号 我得到以下代码 import tkinter as tk brands Bug
  • 具有类实例集合的 For-each 循环,多次处置警告

    这段代码 Private Sub assignButtons ByVal Buttons As Collection ByVal ToolButton As String ByVal nToolButtons As Integer For
  • 将我的付费应用的所有用户迁移到应用内购买

    实际上 我有 2 个应用程序 免费和付费 专业版 我想将我的 2 个应用程序迁移到具有应用程序内购买功能的免费应用程序 我可以保存所有在我的应用内购买中支付专业版费用的人吗 最好的方法是什么 这必须逻辑地处理 1 只需为所有人 推出App的
  • Firefox 5、6、7 和 XULRunner:分别是哪个版本?

    现在测试版已经发布 我正在尝试重新编译一个 Firefox 扩展 该扩展具有可与 Firefox 5 一起使用的二进制组件 根据this https developer mozilla org en Firefox 5 for develo
  • 如何检查十六进制颜色是否“太黑”?

    我正在尝试评估颜色选择器选择的颜色的暗度 看看它是否 太黑 如果是 则将其设置为白色 我想我可以使用十六进制值的第一个字符来实现这一点 它正在工作 但它也在切换一些合法的 浅 颜色 我有以下代码 if lightcolor substrin
  • JavaScript 中可以尝试 {} 而不使用 catch {} 吗?

    我有许多函数 它们要么返回某些内容 要么抛出错误 在主函数中 我调用其中的每一个函数 并希望返回每个函数返回的值 或者如果第一个函数抛出错误 则继续执行第二个函数 所以基本上我目前拥有的是 function testAll try retu
  • AWS Lightsail 上未提供静态文件

    经过 2 天的尝试多个教程并阅读 StackOverflow 后 我正在寻求帮助 那个设定 开发版本在AWS Lightsail服务器上顺利运行 在生产部署期间 我不断遇到静态文件问题 该应用程序在指定的子域上运行 但缺少所有 JS CSS
  • 使用 ReactJS 自动建议输入特定字符

    因此 当使用 Facebook 时 如果您输入 符号 它就会知道您想要链接到朋友 页面 我正在构建一个用户界面 允许用户标记古代文档中的文本 我想做的是 如果用户突出显示一个单词或在单词之前放置 符号 则会弹出自动建议或选项下拉列表 因此
  • 从使用 msvcr90 到 msvcr80,PATH 环境如何影响我正在运行的可执行文件?

    include
  • 在 C++14 中使用自动返回“类型”进行显式模板专业化是否有效?

    上一个问题 https stackoverflow com questions 27629039 c explicit return type template specialisation 我重复上一个问题中的代码以使这个问题独立 如果使