表达式的不同编译器行为: auto p {make_pointer()};

2024-04-13

以下程序的正确行为是什么?

// example.cpp

#include <iostream>
#include <memory>

struct Foo {
  void Bar() const {
    std::cout << "Foo::Bar()" << std::endl;
  }
};

std::shared_ptr<Foo> MakeFoo() {
  return std::make_shared<Foo>();
}

int main() {
  auto p { MakeFoo() };
  p->Bar();  
}

当我在 Linux RHEL 6.6 工作站中编译它时,我得到以下结果:

$ g++ -v
gcc version 5.1.0 (GCC)
$ g++ example.cpp -std=c++14 -Wall -Wextra -pedantic
$ ./a.out
Foo::Bar()

but

$ clang++ -v
clang version 3.6.0 (trunk 217965)
$ clang++ example.cpp -std=c++14 -Wall -Wextra -pedantic
example.cpp:16:4: error: member reference type 'std::initializer_list<std::shared_ptr<Foo> >' is not a pointer; maybe you meant to use '.'?
      p->Bar();
      ~^~
example.cpp:16:6: error: no member named 'Bar' in 'std::initializer_list<std::shared_ptr<Foo> >'
      p->Bar();
      ~  ^
    2 errors generated.

and

$ icpc -v
icpc version 15.0.3 (gcc version 5.1.0 compatibility)
$ icpc example.cpp -std=c++14 -Wall -Wextra -pedantic
example.cpp(16): error: expression must have pointer type
    p->Bar();
    ^
compilation aborted for example.cpp (code 2)

Tl;DR

此行为受提案和演进工作组问题的约束。关于这是否被视为 C++14 缺陷或 C++1z 提案存在一些模糊性。如果事实证明这是 C++14 缺陷,则 gcc 的行为对于 C++14 来说是正确的。另一方面,如果这确实是一个 C++1z 提案,那么 clang 和 icpc 就会表现出正确的行为。

Details

看起来这个案例被覆盖了N3681 http://open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3681.html其中说:

自动和支撑初始化器会导致可教性问题;我们想 教人们使用统一初始化,但我们需要 特别告诉程序员避免使用 auto 大括号。在 C++14 中,我们 现在auto和括号有问题的情况更多了;返回类型 函数的推导部分避免了这个问题,因为返回 大括号列表不起作用,因为它不是表达式。然而,返回 从花括号初始化器初始化的自动变量仍然返回 一个初始化列表,引发未定义的行为。拉姆达初始化 捕获也有同样的问题。本文建议改变一个 大括号初始化的 auto 不会推导出初始化列表,并且 在大括号初始化程序具有的情况下禁止大括号初始化自动 不止一种元素。

并提供以下示例:

auto x = foo(); // copy-initialization
auto x{foo}; // direct-initialization, initializes an initializer_list
int x = foo(); // copy-initialization
int x{foo}; // direct-initialization

So I think clang is currently correct, the latest version of clang provides this warning:

警告:使用推导类型直接列表初始化变量 将在 Clang 的未来版本中改变含义;插入一个“=” 避免行为改变 [-Wfuture-compat]

From 专家工作组第 161 期 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4422.html#161 that N3922 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3922.html为此被采用。

正如 Praetorian 指出的那样,该提案建议这是一个 C++14 缺陷:

EWG 的指示是,我们认为这是 C++14 中的一个缺陷。

但铿锵的C++1z 实现状态说明 http://clang.llvm.org/cxx_status.html这是一个未实现的 C++1z 提案。

因此,如果这是一个 C++14 缺陷,那么 gcc 就会正确,但我不清楚这是否真的是一个缺陷或一个提案。

T.C.指出在一个在这里发表评论 https://stackoverflow.com/questions/33500320/why-this-variable-isnt-deduced-as-initializer-list-in-g-in-c14#comment54798222_33500320那它似乎是 clang 开发者 http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20150209/123102.html确实打算向后移植这个。这种事还没有发生,也不清楚为什么。

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

表达式的不同编译器行为: auto p {make_pointer()}; 的相关文章

  • 如何在 wpf 密码框设置一些默认文本? [复制]

    这个问题在这里已经有答案了 可能的重复 WPF 中的水印文本框 https stackoverflow com questions 833943 watermark textbox in wpf 我可以知道如何在 WPF 的密码框中放入一些
  • 实现 `memcpy()`:需要 `unsigned char *`,还是只需要 `char *`?

    我正在实施一个版本memcpy 能够与它一起使用volatile 使用安全吗char 或者我需要unsigned char volatile void memcpy v volatile void dest const volatile v
  • 在运行时配置 ASP.NET 会话状态

    我们有一个使用 SQL Server 会话状态的 ASP NET 网站 状态配置在Web config like
  • 是否有一种快速替代方法可以从 XNA 中的位图对象创建 Texture2D?

    我环顾四周 发现从位图创建Texture2D的唯一方法是 using MemoryStream s new MemoryStream bmp Save s System Drawing Imaging ImageFormat Png s S
  • C# 按下按钮时跳出循环

    我有一个简单的 C foreach 循环 如何在按下按钮时跳出循环 它不在backgroundWorker线程中 所以我不能使用backgroundWorker Cancellation Pending 在表单中创建一个布尔标志 将事件处理
  • 是否已经有一些基于 std::vector 的 set/map 实现?

    对于小型集合或地图 通常使用排序向量而不是基于树的向量要快得多set map 特别是对于 5 10 个元素的情况 LLVM 有一些类本着这种精神 http llvm org docs ProgrammersManual html ds se
  • 如何在 Xamarin.Forms 中强制使用浅色模式?

    我的应用程序的 UI 设计为在灯光模式下使用 但如果手机的默认主题是深色模式 我的应用程序也会切换到深色模式 并且 UI 看起来很垃圾 所以我想强制我的应用程序使用灯光模式 我怎样才能做到这一点 In my app xaml我使用的文件Us
  • 如何将 list 对象附加到另一个对象

    在 C 中 我有两个list
  • EWS 消息跟踪报告

    我一直在研究如何使用 EWS 从交换中获取消息跟踪报告 但似乎无法查明任何内容 我打算构建一个抓取日志文件的应用程序 但如果我可以通过 EWS 来完成它 那对我正在做的事情会更好 有任何想法吗 我终于能够为我的问题创建一个解决方案 我在 C
  • JObject ToString 与 StringEnumConverter 不起作用

    我正在尝试序列化一个匿名类 如下所示 public enum ErrorCode A B C var response JObject FromObject new Error new Message Test Code ErrorCode
  • 如何创建 .bat 文件来运行 C# 代码?

    我需要的是 我有一个 C 代码 我想构建它以便在桌面上创建一个 bat 文件 因此 当我从桌面运行这个 bat 文件时 它应该执行 C 代码 有没有办法在编译之前更改 c 项目的设置或属性 以便创建应运行此 c 代码的 bat 文件 将 C
  • C# 中的异步方法如何工作?

    我在我的一些项目中使用异步方法 我喜欢它 因为它使我的应用程序更具可扩展性 但是 我想知道异步方法如何在后台真正工作 NET 或 Windows 如何知道调用已完成 根据我进行的异步调用的数量 我可以看到创建了新线程 但并不总是 为什么 此
  • 这个对象的内存会是什么样子?

    我想知道这个类 它的对象 的内存布局是什么样的 class MyClass string myString int myInt public MyClass string str int i myString str myInt i MyC
  • C++ 中的静态虚函数

    我有一个基类和一个派生类 我想更改基函数 同时保持它们静态 因为它们应该作为静态传递给其他函数 我怎样才能做到这一点 ATL 框架通过将基类设为模板 然后让派生类将其类类型作为模板参数传递 从而绕过了无虚拟静态的限制 然后 基类可以在需要时
  • 如何对具有无效值的属性使用 JSON.net 的默认值

    我正在使用 Newtonsoft JSON 库来反序列化来自 Web 服务的响应 问题是某些字段包含无效值 例如 一条记录上的一个字段包含一个 T 表示该字段应该是数字 我想做的是将无效字段的值设置为 null 或其他默认值 我的所有属性都
  • 使用全局 Web API 过滤器属性进行 Unity 依赖注入

    参考这个CodePlex 统一文章 http unity codeplex com discussions 446780我能够使用 WebAPI 控制器获取过滤器属性 如下所示 MyFilterAttribute public class
  • 使用C#在SQL Server上执行sql文件

    我有很多程序 视图 函数等文件 我想在 SQL Server 2005 2008 上的适当数据库中执行这些文件 创建组件 还有一点是我想使用 C 来执行它们 另一点需要提及的是 我希望应用程序也可以在远程 SQL Server 上执行此文件
  • 对 MFC UI 应用程序进行单元测试吗?

    如何对大型 MFC UI 应用程序进行单元测试 我们有一些大型 MFC 应用程序已经开发了很多年 我们使用一些标准的自动化 QA 工具来运行基本脚本来检查基础知识 文件打开等 这些由 QA 小组在日常构建后运行 但我们希望引入一些程序 以便
  • 有C语言的解释器吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话
  • 在.Net中使用ObjectCache缓存对象并设置过期时间

    我陷入了一个场景 我的代码如下 更新 它不是关于如何使用数据缓存 我已经在使用它及其工作 它是关于扩展它 以便该方法在到期时间和从外部源获取新数据之间不会进行调用 object string this GetDataFromCache ca

随机推荐

  • 突出显示两个字符串之间的差异

    如果我有两个较长的字符串 VARCHAR2 是否有一种简单的方法或算法可以复制或移植到 PL SQL 来比较它们 插入标记 即 以便在网页中呈现时 差异将突出显示 例如 BEGIN DBMS OUTPUT put line markup d
  • 如何动态切换 jquery 中的元素?

    所以我想做的是制作一个动态的小脚本来选择县和城市 好吧 我在 mysql 数据库中拥有所有国家和城市 如果我选择一个县
  • 如何在 GitLab CI 中显示来自另一个存储库的测试

    因此 我的项目包含单元测试 当我在 GitLab 中配置 CI 系统后发出合并请求时 它们会很好地显示为绿色或红色圆圈 但现在我也有一些集成测试 它们驻留在单独的存储库中 你为什么问 因为我有多个微服务需要一起测试 并且每个微服务都有自己的
  • vim 定界伴侣

    使用 DelimitMate 它会自动生成右括号 当我在括号内输入完毕后 按什么键可以快速转到右括号的右侧 现在我必须手动按 ESC 然后按 a 这些自动关闭插件 就像 Eclipse 等 IDE 中的原始功能实现一样 的想法是 您只需ty
  • C#:最易读的字符串连接。最佳实践[重复]

    这个问题在这里已经有答案了 可能的重复 我应该如何连接字符串 https stackoverflow com questions 3102806 how should i concatenate strings 在日常任务中 当执行任务时
  • 最小化时窗口内容消失

    我有一个简单的类 当鼠标拖动时画一条线 或者当鼠标按下 释放 时画一个点 当我最小化应用程序然后恢复它时 窗口的内容消失 除了最后一个点 像素 我明白这个方法super paint g 每次窗口更改时都会重新绘制背景 但无论我是否使用它 结
  • WebApi HTTPPOST 端点未命中

    我有以下简单的 HTTPPOST 端点 AllowAnonymous HttpPost Route forgotPassword public IHttpActionResult ForgotPassword string userName
  • 如何暂停 main()

    我正在尝试编写我的程序 以便当用户单击 Drive To JButton 在我的主类 Dispatch 中 时 它会从另一个类 Cab 打开一个 JFrame GoToDistination 用户可以在其中输入所需的内容信息 单击 继续 后
  • 如何仅在 Scrollview/Recyclerview 的底部添加淡入淡出边缘?

    I am using requiresFadingEdge true for adding fading effect at the bottom but the problem is it also shows fading effect
  • 如何将字符串{}值替换为obj(键值)

    我最近开始在 NodeJs 上编程 我有不同的字符串和 Json 对象 eg var str My name is name and my age is age var obj name xyz age 24 var str I live
  • 如何在 XML 模式中使任一字段为必填字段

    我有一个如下所示的架构 我有一些关于该架构的问题 1 制作方法CourierNumber or WorkLocationCoordinate强制性的 我使用了如下所示的一种全局类型 EDIT正如 Abel 在修改后的模式中提到的那样 仍然没
  • '无法在descriptionForLayoutAttribute_layoutItem_coefficient中创建描述。有些东西是零

    首先 我用 3 个不同的 UIView 来替换 iPad Storyboard 上 Split View Controller 中的详细视图 它在 iOS 8 iPad 上运行良好 但是 当我加载详细视图之一时 应用程序在 iOS 7 和
  • 递归可以命名为简单的函数调用吗?

    请考虑递归函数 1 int calc int num 2 sum sum num sum is a global variable 3 num 4 if num 0 5 return sum 6 calc num 它计算一个整数的总和 我的
  • 如何使用 Objective c 在 iOS 9.3 中添加动画到启动屏幕

    如何在 iOS 9 3 中制作如下图所示的动画启动屏幕 基本上 您无法制作动画启动画面 但是 您可以在故事板中复制启动屏幕 并将其作为应用程序的入口视图控制器 VC 然后 当视图加载时 您可以开始动画 最终结果是 您将得到一个 动画启动画面
  • 我的 jframe 不显示 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我是java编程的初学者 我试图让我
  • OCaml 中 let rec 的限制

    这几天我在学习OCaml 发现了这个 OCaml 对于可以放在 let 记录右侧的内容有限制 像这个 let memo rec f norec let rec f memoize fun x gt f norec f x in f Erro
  • C# Windows 应用程序未关闭

    我有一个 C Windows 应用程序 我将其放置在测试服务器上 该服务器的设置不受我的公司控制 安全上下文也不受我的公司控制 我双击exe 应用程序运行 我看到我的表格 我关闭应用程序 打开任务管理器 但仍然看到应用程序的足迹 taskk
  • Node.js:获取客户端的IP

    req connection remoteAddress req headers x forwarded for req ip req ips 这一切意味着什么 有没有一种直接的方法可以简单地获取向我的 Node js Express 站点
  • python 将字符串解析为csv格式

    我有一个包含以下格式的行的文件 aaa A bbb B ccc C 我想将其转换为 csv 格式 以便方程两边的文字将是列 分号将作为行分隔符 我尝试做这样的事情 f open aaa txt r with open ccc csv w a
  • 表达式的不同编译器行为: auto p {make_pointer()};

    以下程序的正确行为是什么 example cpp include