函数定义还是变量定义?

2023-12-12

为什么编译器将此行解释为函数定义而不是变量定义:

Y y(X());

在下面的代码中:

#include <iostream>

struct X {
  X() { std::cout << "X"; }
};

struct Y {
  Y(const X &x) { std::cout << "Y"; }
  void f() { std::cout << "f"; }
};

int main() {
  Y y(X());
  y.f();
}

VS2010 在“y.f();”行给出以下错误

left of '.f' must have class/struct/union

标准的哪一部分描述了这种行为? 以下问题的答案没有提供有关它的详细信息:最麻烦的解析


考虑一下:

float foo( int () )

这声明了一个函数foo(接受一个函数返回int)返回float.

Now read

Y y(X());

as y作为函数(接受函数返回X)返回Y

问题的产生是由于C++ 最麻烦的解析

可以用以下方法解决:

 Y y{ X() }; // requires C++11

or

Y y( ( X() ) );
  // ^     ^ notice parenthesis 

Update基于编辑:

A 引用自标准 :

§ 8.2歧义消解 [dcl.ambig.res]

1 - 由于函数样式转换和 6.8 中提到的声明之间的相似性而产生的歧义也可能出现在声明的上下文中。在这种情况下,需要在参数名称周围带有一组冗余括号的函数声明和带有函数样式强制转换作为初始值设定项的对象声明之间进行选择。正如文中提到的含糊之处6.8,决议是考虑任何可能是声明的构造。[注意:声明可以通过非函数风格的强制转换、通过 = 来指示初始化或通过删除参数名称周围的多余括号来显式消除歧义。 ]

[Example:

struct S {
    S(int);
};

void foo(double a)
{
   S w(int(a));  // function declaration
   S x(int());   // function declaration
   S y((int)a);  // object declaration
   S z = int(a); // object declaration
}
—end example]

类似地,其他例子也紧随其后。

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

函数定义还是变量定义? 的相关文章

  • CMake(Ninja 后端)使用 /MT 编译

    我有一个类似的问题CMake 使用 MT 而不是 MD 进行编译 https stackoverflow com questions 14172856 cmake compile with mt instead of md但有一些差异 我正
  • Visual Studio 2013 调试器显示 std::string 的奇怪值

    我有一个大型的 cmake 生成的解决方案 其中包含许多项目 由于某种原因 我无法查看字符串的内容 因为根据调试器 Bx Buf含有一些垃圾 text c str 正确返回 Hello 该问题不仅仅发生在本地字符串上 返回的函数std st
  • 如何在 Linux 上重新实现(或包装)系统调用函数?

    假设我想完全接管 open 系统调用 也许要包装实际的系统调用并执行一些日志记录 一种方法是使用 LD PRELOAD http scaryreasoner wordpress com 2007 11 17 using ld preload
  • 用于 C++ 中图像分析的 OpenCV 二进制图像掩模

    我正在尝试分析一些图像 这些图像的外部周围有很多噪声 但内部有一个清晰的圆形中心 中心是我感兴趣的部分 但外部噪声正在影响我对图像的二进制阈值处理 为了忽略噪音 我尝试设置一个已知中心位置和半径的圆形蒙版 从而使该圆之外的所有像素都更改为黑
  • 从图像创建半透明光标

    是否可以从图像创建光标并使其半透明 我目前正在拍摄自定义图像并覆盖鼠标光标图像 如果我可以将其设为半透明 那就太好了 但不是必需的 销售人员喜欢闪亮的 目前正在做这样的事情 Image cursorImage customImage Get
  • DateTime.ParseExact - 为什么 yy 变成 2015 而不是 1915

    为什么 NET 假定以下年份是 2015 年 而不是 1915 年 var d DateTime ParseExact 20 11 15 dd MM yy new CultureInfo en GB 我想 它会尝试接近 但其背后是否有合理的
  • 更改私有模块片段是否会导致模块重新编译?

    On 此页面有关 C 20 模块功能 https www modernescpp com index php c 20 modules private module fragment and header units 我发现了这样的说法 借
  • 使用任一默认捕获模式时,这是通过复制捕获还是 (*this) 通过引用捕获?是一样的吗?

    当我看到以下工作时我有点困惑 struct A void g void f g 但后来我发现this https stackoverflow com a 16323119 5825294答案非常详细地解释了它是如何工作的 本质上 它归结为t
  • 运行实体框架自定义工具,它有什么作用?

    在 Visual Studio 中 当使用实体框架并为 tt 和 Context tt 文件应用运行自定义工具时 它是什么以及它有什么作用 为什么它解决数据库同步问题 有时 为什么我应该在运行 tt 之前运行它 Context tt 它被称
  • 如何在VS2005中使用从.bat而不是.exe启动的外部程序进行调试?

    在我的 c 项目的调试属性中 我选择了 启动外部程序 并选择了我希望将调试器附加到的程序的 exe 但是 现在我需要从 bat 文件而不是 exe 启动程序 但 VS2005 似乎不允许这样做 这可能吗 编辑 为了澄清 我需要调试从 bat
  • C++网络序列化[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种将 C 数据包序列化为网络流的解决方案 我在这里看到很多帖子提到人们 ACE 谷歌协议缓
  • 从单应性估计 R/T

    我一直在尝试计算 2 个图像中的特征 然后将这些特征传递回CameraParams R没有运气 特征已成功计算并匹配 但是问题是将它们传递回R t 我明白你必须分解Homography为了使这一点成为可能 我已经使用如下方法完成了 http
  • Clang 5.0 上的 vsprintf 和 vsnprintf [-Wformat-nonliteral] 警告

    我有这段代码 static void err doit int errnoflag int level const char fmt va list ap int errno save unsigned long n char buf MA
  • 查找数组中的多个索引

    假设我有一个像这样的数组 string fruits watermelon apple apple kiwi pear banana 是否有一个内置函数可以让我查询 apple 的所有索引 例如 fruits FindAllIndex ap
  • 在多线程环境中捕获信号

    我有一个大型程序 需要尽可能具有弹性 并且有大量线程 我需要捕获所有信号SIGBUS SIGSEGV 并在必要时重新初始化有问题的线程 或者禁用该线程以继续减少功能 我的第一个想法是做一个setjump 然后设置信号处理程序 可以记录问题
  • 尝试后终于没有被调用

    由于某种原因 在我的控制台应用程序中 我无法运行我的finally 块 我编写这段代码是为了测试finally块是如何工作的 所以它非常简单 static void Main int i 0 try int j 1 i Generate a
  • java有类似C#的属性吗? [复制]

    这个问题在这里已经有答案了 C 属性 我的意思是 get 和 set 方法 是一个非常有用的功能 java 也有类似 C 的属性吗 我的意思是我们如何在 java 中实现类似以下 C 代码的内容 public string Name get
  • 稀疏矩阵超定线性方程组c/c++库

    我需要一个库来解决 Ax b 系统 其中 A 是一个非对称稀疏矩阵 每行有 8 个条目 而且可能很大 我认为实现双共轭梯度的库应该没问题 但我找不到一个有效的库 我尝试过 iml 但 iml sparselib 包中缺少一些标头 有小费吗
  • 使用空的weak_ptr作为参数调用map::count安全吗?

    打电话安全吗map count http www cplusplus com reference map map count on an 未初始化因此为空weak ptr http en cppreference com w cpp mem
  • 如何使用 Microsoft Graph API 更新 MailboxSettings

    我想从不同的日历更新邮箱设置 如何构建可以通过 Microsoft Graph 更新 MailboxSetting 的请求 这是我的代码示例 但有例外 代码示例 User obj GraphServiceClient Users roomC

随机推荐

  • 计算 epub 的总页数

    我是 epub 新手 我有许多不同的 epub 格式文件 我将使这些文件在线可读 我不太了解 epub 文件中的内容 有什么方法可以让我知道我的页面有多少页epub文件 我可以使用xml javascript PHP或任何其他方式 如果有
  • 无法初始化连接器[重复]

    这个问题在这里已经有答案了 严重 无法初始化组件 Connector org apache coyote http11 Http11AprProtocol 8443 org apache catalina LifecycleExceptio
  • 如何暂停和恢复应用于 ccSprite 的操作?

    我创建了一个像这样的动画 CCSpriteFrameCache sharedSpriteFrameCache addSpriteFramesWithFile Actor plist spriteSheet CCSpriteBatchNode
  • 为数组分配然后使用构造函数

    人 java public class Person public String firstName lastName public Person String firstName String lastName this firstNam
  • 将所有函数调用记录到控制台

    我经常会通过将每个函数调用记录到控制台并查找有缺陷的情况中的差异来开始调试类 是否有一些属性可以应用于类以启用此类跟踪 必须输入这些内容真是太累了 Console WriteLine classname methodname 到每个方法并在
  • 在 Goutte 中设置代理

    我尝试过使用 Guzzle 的文档来设置代理 但它不起作用 Goutte 的官方 Github 页面已经死了 所以在那里找不到任何东西 有人知道如何设置代理吗 这是我尝试过的 client new Client client gt setH
  • 如何将 Prompt.Choice() 的结果转发到当前对话框?

    我在用着PromptDialog Choice 向我的用户提供不同的选项 尝试次数设置为 0 因此如果他们输入任何无效选项 则不会进行任何重试 在这种情况下 我想将输入的文本传递给当前的对话框 该对话框已呈现提示并让它处理消息 这样做的正确
  • 使用 GitHub API 在一次提交中编辑多个文件

    我在 C Web 应用程序 使用 Blazor 中使用 GitHub API 我希望能够创建单个提交来添加 删除和编辑存储库中文件夹中的多个文件 我知道我可以向该 URL 发送 PUT 请求https api github com repo
  • 结构体和相应变量的大小

    如果我定义一个 char 变量 char a 以及具有单个 char 成员的结构 struct OneChar char a 这两个定义在所有编译器中都具有 char 的大小吗 我的疑问是 如果我们在结构体中定义一个 char 变量 由于内
  • PHP 中确定文件是否为图像的最佳方法是什么?

    我有一个人们可以上传文件的服务器 问题是某些文件名被破坏 没有任何扩展名 因此我无法立即确定文件类型 这个问题分为两部分 对于有文件名的文件 确定它是否是图像的最佳方法是什么 只是一个很长的if else if列表 其次 对于没有扩展名的文
  • 根据邮政编码自动填充国家和城市,反之亦然

    我正在尝试制作一个需要地址和邮政编码的简单表单 所以我想知道是否有一种方法可以根据用户已经输入的内容自动填充这些字段 例如 如果他决定仅输入邮政编码 则城市和国家字段将自动填充 反之亦然 经过一段时间的搜索后 我发现了这些我可能会使用的数据
  • Android:如何在子活动中使用从父活动传递的数据?

    当我们想要将数据从活动传递到子活动时 我们使用 intent pushextra 方法并传递请求代码和任何附加数据 现在在子活动中如何获取附加数据或请求代码 有没有任何事件处理程序可以处理这个问题 thanks You use intent
  • 如何在 Visual Studio 2010 中编译 CUDA 应用程序?

    如何在 Visual Studio 2010 中编译 CUDA 应用程序 这是我的步骤 1 创建没有预编译头的空C 项目 2 添加main cpp int main return 0 添加 kernels cu 我参考了示例项目MAtrix
  • 如何在使用我的应用程序时禁用所有 iOS 通知横幅?

    有人提出了此问题的 React Native 特定版本 但没有得到解答React Native 当我的应用程序处于活动状态时 如何禁用所有推送通知 本质上 有没有办法消除我的应用程序位于前台时的中断 理想情况下 我会将应用程序置于 焦点 状
  • 更改主窗口背景颜色 WPF

    我正在尝试使用名为 EditColorDialog 的对话框更改 MainWindow 的背景颜色 该对话框可以很好地读取主窗口的当前背景颜色 但我似乎无法让它更改该颜色 public partial class EditColorDial
  • 如何使用剪切路径处理倾斜边缘?

    当前使用此 CSS 实现从左到右向上的底部倾斜 clip path polygon 0 0 100 0 100 calc 100 3vw 0 100 它对于响应式解决方案非常有效 但很难弄清楚如何为响应式解决方案执行此操作 以实现 div
  • 用于多封电子邮件的正则表达式验证器

    我正在验证文本框的有效电子邮件
  • 如何获取设备中存储的所有图像并在iPhone sdk中将它们显示为图库

    我想获取设备中存储的所有图像 并在我的 iPhone 应用程序中将它们显示为图库 UIImagePickerController 以缩略图视图显示所有照片 在选择每张照片时 我们仅获取该特定选定图像的数据 而不是我想一次获取所有照片并将它们
  • 从 Chrome 扩展程序访问 Google Maps API

    假设我想在任何网页上查找地址 然后单击每个地址 在地址下方插入一个小的 Google 地图 我遇到的问题是 GMaps 库必须通过 26631 35760 21152 36733 12290 20294 30001 20110 36890
  • 函数定义还是变量定义?

    为什么编译器将此行解释为函数定义而不是变量定义 Y y X 在下面的代码中 include