MSVC 直接构造函数调用扩展

2024-04-06

In 这个回应 https://stackoverflow.com/a/23274182/420683, 没有手套的 https://stackoverflow.com/users/1902313/tloveless指出可以在 MSVC 中使用this->foo::foo(42);构造函数委托直接调用构造函数:

#include <iostream>

struct foo
{
    int m;
    foo(int p) : m(p) { std::cout << "foo("<<p<<")\n"; }
    foo()
        : m(0)
    {
        this->foo::foo(42);
        std::cout << "foo(), " << m << "\n";
    }
};

int main()
{
    foo f;
    std::cin.ignore();
}

我很惊讶这甚至可以在 MSVC 中编译; clang++、g++ 和我都同意这是非法的,例如[class.ctor]/2 “因为构造函数没有名称,所以它们是 在名称查找期间从未找到”

然而,MSVC 甚至不发出警告/Wall并且没有语言扩展/Za在 MSVC12 Update 1 (2013) 和 MSVC10 SP1 (2010) 中。

输出是:



foo(42)
foo(), 42
  

在两个版本中。所以没有创建临时的,而是调用了一个构造函数。

问题:

  1. 这个扩展的名称是什么?
  2. 不也算是一种延伸吗? (/Za扩展列表 http://msdn.microsoft.com/en-us/library/34h23df8%28v=vs.100%29.aspx似乎不这么认为)
  3. 是否有此功能的一些文档/官方描述?

(I tagged this question with the [delegating-constructors] tag since it reminds me heavily of this feature)


元信息:我几乎确定这个问题是重复的,因为这个功能有些人所知。例如,参见这个答案 https://stackoverflow.com/a/9359241/420683一个“类似的问题”。如果您能找到描述此功能的答案,请立即将其作为重复项关闭。


它不是构造函数委托。尝试以下代码:

#include <iostream>

class C{
public:
    C() { std::cout << "C" << std::endl; }
    ~C() { std::cout << "~C" << std::endl; }
};

struct foo
{
    int m;
    C c;
    foo(int p) : m(p) { std::cout << "foo("<<p<<")\n"; }
    foo()
        : m(0)
    {
        this->foo::foo(42);
        std::cout << "foo(), " << m << "\n";
    }
};

int main()
{
    foo f;
}

根据输出字段“c”被初始化两次但仅被销毁一次。作为zneak注意到,它类似于new (this) foo(42).

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

MSVC 直接构造函数调用扩展 的相关文章

  • C++,多语言/本地化支持

    向 C 程序添加多语言支持的最佳方法是什么 如果可能 应该从包含键值对 WelcomeMessage Hello s 之类的纯文本文件中读取语言 我想到了添加一个 localizedString key 函数来返回加载的语言文件的字符串 有
  • fork 和 exec 之间的区别

    两者有什么区别fork and exec 指某东西的用途fork and exec它体现了 UNIX 的精神 它提供了一种非常简单的方法来启动新进程 The fork调用基本上复制了当前进程 在almost任何方式 并非所有内容都会被复制
  • C++ 天花板函数的奇怪结果

    我一直在尝试天花板功能并得到一些奇怪的结果 如果我对十进制数乘以百执行 ceil 运算 我会得到一定的结果 但是 如果我直接对该乘法的结果执行 ceil 我会得到完全不同的输出 另一个问题是 这些不同的结果仅发生在某些数字上 任何帮助 将不
  • 如何在 C# 中启动文件

    编辑 我觉得自己像个白痴 我有一种感觉 像下面的答案会起作用 但没有看到任何与下面的答案类似的谷歌结果 所以当我看到这段复杂的代码时 我想它一定是这样的 我搜索并找到了这个Windows 列出并启动与扩展关联的应用程序 https stac
  • 找不到 HttpContextBase 命名空间

    public string GetCartId HttpContextBase context if context Session CartSessionKey null if string IsNullOrWhiteSpace cont
  • File.ReadAllLines 或流读取器

    我们可以使用以下方式读取文件StreamReader http msdn microsoft com en us library vstudio system io streamreader或通过使用File ReadAllLines ht
  • .NET Core 2 - 从启动中调用存储库方法[重复]

    这个问题在这里已经有答案了 我有以下存储库和类 public interface IValueService GetAll public class ValueService IValueService private DataContex
  • 更新 OSX 命令行工具 6.3 后缺少 C++ 标头 <__debug>

    从 App Store 更新到 Command Line Tools 6 3 后 程序包括
  • 使用 INF 文件 C++ 以编程方式安装驱动程序

    这里有人可以告诉我如何安装第 3 方设备驱动程序吗 如果提供了所有必需的文件 即 inf 文件 sys 等 则以编程方式进行 这 该解决方案应运行的最低操作系统是Windows2000 我尝试复制 inf文件放入Win文件夹 INF文件夹和
  • 如何修改 edmx 的默认代码生成策略?

    我想修改默认的代码生成策略 该怎么做 我只是想修改类名 lt code Escape container gt to Entities并将默认连接字符串更改为name Default 我不想为该项目创建模板文件 我想编辑它以便它可以在全球范
  • C++头文件问题

    我在处理类时尝试了一些 C 代码 这个问题出现在我身上 并且让我有点烦恼 我创建了一个包含类定义的头文件和一个包含实现的 cpp 文件 如果我在不同的 cpp 文件中使用此类 为什么要包含头文件而不是包含类实现的 cpp 文件 如果我包含类
  • C++20 views::join 在生成的嵌套范围::single_view 上进入无限循环

    我正在使用 GCC 实现 v10 2 和 v11 来处理 C 20 范围 测试的行为std views join https en cppreference com w cpp ranges join view 我尝试使用生成嵌套视图sin
  • 从 TFS 下载工作项附件(文件已损坏)

    我正在尝试创建 C 代码 因此我可以自动从 Team Foundation Server 下载 BUGS 预定义查询的所有附件 该代码似乎工作得很好 但所有下载的文件都因意外原因而损坏 我无法查看它们 有人可以看一下代码并分享意见吗 非常感
  • 为什么 C++ 元组如此奇怪?

    我通常创建自定义structs将不同类型的值分组在一起时 这通常很好 而且我个人发现命名成员访问更容易阅读 但我想创建一个更通用的 API 在其他语言中广泛使用元组后 我想返回类型的值std tuple但发现它们在 C 中使用比在其他语言中
  • 将纬度/经度转换为 X/Y,以便在美国地图图像上进行阿尔伯斯投影

    我正在尝试使用 C 或 Javascript 将纬度 经度转换为 X Y 坐标 以将带有 CSS 的 div 左 上 定位到美国地图的背景图像上 美国的标准地图投影是阿尔伯斯投影 如下所示 但 StackOverflow 仅提供参考基本墨卡
  • Roslyn,通过 hostObject 传递值

    我正在尝试通过 hostObject 发送一个类 但显然它不想工作 using Roslyn Compilers using Roslyn Compilers CSharp using Roslyn Scripting using Rosl
  • 如何将这个基于代码的 WPF 工具提示转换为 Silverlight?

    以下工具提示代码适用于WPF 我正在努力让它发挥作用银光 但它给了我这些errors TextBlock does not contain a definition for ToolTip Cursors does not contain
  • 致命:所有操作都需要OperationId。请为路径的“获取”操作添加它

    我正在使用 AutoRest 从 swagger json 生成 api 的客户端 输出是 AutoRest code generation utility cli version 3 0 6187 node v10 16 3 max me
  • 当前线程中的单例

    我的单身人士如下 public class CurrentSingleton private static CurrentSingleton uniqueInstance null private static object syncRoo
  • 我应该为每个 Web 请求使用静态缓存的 ResourceManager 还是一个新实例?有关系吗?

    创建新的 NET 对性能 或其他 有何影响 如果有 ResourceManager根据每个请求new ResourceManger myResourceType FullName myResourceType Assembly 与在 Des

随机推荐

  • 如何在 Visual Studio 2010 中设置 winforms 项目的启动窗体

    有谁知道如何在 Visual Studio 2010 中设置 winforms 项目的启动表单 我已经骑行去项目属性并更改启动对象 但在 dowpdownlist 中唯一可用的选项是 无 和 ProjectName Program cs p
  • 如何从使用 Firebase 设置的一个 IOS 应用程序读取/写入另一个 Firebase 项目中包含的另一个 Firebase 数据库?雨燕3

    我有一个 Firebase 数据库通过 GoogleService Info plist 连接到我的 IOS 应用程序 在 AppDelegate 中 我配置了应用程序 FIRApp configure 我可以读 写数据 现在 在这个 IO
  • 应该使用 unique_ptr 来更轻松地实现“移动”语义吗?

    Edit made Foo and Bar稍微不那么琐碎 直接替换为shared ptr lt gt 更加困难 Should unique ptr lt gt 用作实现移动语义的更简单方法 对于像这样的课程 class Foo int m
  • UIDatePicker 只显示周日的日期?

    我们如何设置 UIDatePicker 值以在 swift iOS 中仅显示星期日的日期 最后 我自己找到了解决方案 在 didSelectRow 方法中检查所选日期是否是星期日 如果是 则可以 但如果不是 则重新加载组件以选择最近星期日的
  • 使用curl命令将文件保存到特定文件夹

    在 shell 脚本中 我想从某个 URL 下载文件并将其保存到特定文件夹 我应该使用什么特定的 CLI 标志来将文件下载到特定文件夹curl命令 或者我怎样才能得到这个结果 我不认为你可以给出curl的路径 但你可以CD到该位置 下载并C
  • PropertyAccessor.GetProperty( PR_ATTACH_DATA_BIN) Outlook 附件失败

    我需要创建一个 OutLook 加载项 用于捕获带有大附件的电子邮件 并将附件替换为可用于下载附件的 URL I found this https msdn microsoft com en us library office hh2908
  • git pull 忽略图像文件

    我是一个存储库的贡献者 偶尔会发布图像 图片确实不是必需的 但其他贡献者将继续add and push他们到存储库 我想表演pull忽略图像文件后缀的操作 例如 png git 目录占用了太多空间 我真的不需要拉这些图像文件 我怎能不pul
  • Android Eclipse 启动委托调试会话卡在 27%

    Eclipse 似乎停留在 27 启动 MyProject 27 Eclipse 可能会解释更多 我真的没有30分钟的时间看这个 我的意思是 如果有什么东西在它的方式可能喜欢它需要的资源 它在哪里表明在这么长的时间内问题是什么 see 尝试
  • Java Mockito-如何模拟参数数量不确定的方法

    我尝试使用 Mockito 来模拟getDeclaredMethod 爪哇的 但该方法的参数是不确定的 如何模拟这样的方法 public Method getDeclaredMethod String name Class paramete
  • 重音字符的问题

    I have a search box on my site and i need to replace all the Spanish characters that user types in to equivalent English
  • 使用计时器和游戏循环

    我正在构建一个简单的控制台游戏 玩家会移动当按键按下时 并且有移动的敌人自动 每种类型的敌人在 X 毫秒内移动一次 据我了解我应该使用timer 但我真的不知道如何在游戏循环中做到这一点 尚未构建 因为我不知道如何使用计时器 但它应该是wh
  • jQuery ajax 回调类成员? [复制]

    这个问题在这里已经有答案了 可能的重复 有没有办法让 JQuery ajax 成功函数访问它所包含的对象 https stackoverflow com questions 5378622 is there a way for a jque
  • 使用 GDI+ 创建透明背景的图像?

    我正在尝试创建一个具有透明背景的图像以显示在网页上 我尝试了几种技术 但背景总是黑色的 如何创建一个透明图像 然后在其上绘制一些线条 Call Graphics Clear Color Transparent 好 清晰图像 不要忘记使用具有
  • JTree 在应用程序启动时添加节点

    我想使用文件浏览器创建文本编辑器 因此当我启动应用程序时 我希望我的程序在 JTree 上添加节点 以便它向我显示所有文件和文件夹 例如 我的文档 文件夹中的所有文件和文件夹 并让我能够访问这些文件和文件夹 尤其是文件夹 我试图弄清楚安德鲁
  • 具有 contenteditable 的 onChange 事件[重复]

    这个问题在这里已经有答案了 代码如下 text span blah blah span text onChange 事件不起作用 至少在火狐浏览器中 我不想使用文本区域 输入标签 因为必须可以仅更改文本中的特定单词 并且必须内联显示 而不是
  • 使用 SQL 代理运行 SSIS 包时出现问题 - 失败并显示“DTSER_FAILURE(1)”

    我有一个存储在 MSDB 数据库中的 SSIS 包 当我执行它时它工作正常 它将在 SA 帐户下运行或使用 Windows 安全性 我想安排此作业与 SQL Agent 一起运行 但是当我这样做时 我收到一个奇怪的错误 并且我尝试的任何配置
  • Discord Webhook 消息无法发送

    所以我有一段不久前有人发布的代码 到现在已经完美运行一年了 它采用谷歌表单答案并将其作为网络钩子发布到不和谐频道 现在从昨天开始就不再起作用了 脚本没有任何改变 function onSubmit e var form FormApp ge
  • 为什么我无法导入 folium python 包?

    我已经 pip 安装了 folium 当我在主目录中工作时尝试导入它时 出现此错误 ImportError Traceback most recent call last
  • 使用程序员 dvorak 键盘布局(移位数字)在 xmonad 中切换工作区

    好吧 我实际上并没有使用德沃夏克 但是Neo2 http neo layout org 但由于我使用的是矩阵式键盘 真正符合人体工程学 http www trulyergonomic com 我也改变了数字 因此我的这个结构xmonad h
  • MSVC 直接构造函数调用扩展

    In 这个回应 https stackoverflow com a 23274182 420683 没有手套的 https stackoverflow com users 1902313 tloveless指出可以在 MSVC 中使用thi