草庐IT

c++ - 不寻常的编译器错误转换为无效?

coder 2023-11-15 原文

我正在为我正在教授的类(class)整理基于 C++ 的作业。我有一个函数要导出给学生,我希望他们在程序的不同点调用它,以便在评分期间,我们可以拦截这些调用以确保他们在正确的时间做正确的事情.我不希望该代码在提供的起始文件中做任何事情,所以我只是给函数一个主体,它只有一系列语句,将所有参数转换为 void 以抑制编译器警告未使用的参数。在这样做的过程中,我遇到了一个我以前从未见过的不寻常的编译器错误,并且对该站点的搜索没有找到任何有用的信息。

this reduced test case 可以很好地说明该错误:

void iDontUseMyArguments(int a, int b) {
    (void) a;    // Explicit cast to void - totally fine!
    (void) b;
}

void iDontEither(int a, int b) {
    (void) a, b;  // Comma expression casted to void, though technically
                  // b isn't casted to void!
}

void norDoI(int a, int b) {
    void(a, b);   // ERROR! No idea why this isn't okay.
}

void meNeither(int a, int b) {
    (void)(a, b); // Comma expression casted to void - totally fine!
}

void jumpOnBandwagon(int a, int b) {
    void((a, b)); // Comma expression casted to void - totally fine!
}

如您所见,其中大部分都可以正常编译。问题出在这个问题上:

void(a, b);

这会触发以下错误:

prog.cpp: In function 'void norDoI(int, int)':
prog.cpp:11:11: error: expression list treated as compound expression in functional cast [-fpermissive]
   void(a, b);
           ^

我从未遇到过此错误消息,所以我不确定这是要告诉我什么。

这条线背后的意图

void(a, b);

是一个包含 ab 的逗号表达式,然后使用函数式转换将其转换为 void 类型。如您所见,以下变体都有效:

(void)(a, b);
void((a, b));

我怀疑这可能与 Most Vexing Parse 有关,并且这被解释为声明,但我遇到的特定错误似乎与此不符。

我的问题如下:

  1. 确切地说,为什么这段代码不合法​​?
  2. 编译器认为我要做什么?
  3. 确切地说,为什么这些其他变体是合法的?

最佳答案

给定这个结构:

struct S {
  S(int, int) {}
};

什么是S(1, 2)什么意思?

答案:意思是你构造了一个S类型的对象来自值 12 .


给定这个函数模板:

template <typename T> T f() { return T(1, 2); }

什么是T(1, 2)什么意思?

答案:意思是你构造了一个T类型的对象来自值 12 ,这是可能的,如果 T例如类型 S从第一个问题开始。


给定相同的函数模板,然后做什么 f<void>()什么意思?

答案:它试图构建一个单一的 void来自两个值的值 12 .这会失败,因为只能将单个值转换为 void .


是否 void(1, 2)表示与 T(1, 2) 不同的任何内容什么时候T恰好是 void

回答:不对,意思完全一样,所以是错误的。

关于c++ - 不寻常的编译器错误转换为无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41749235/

有关c++ - 不寻常的编译器错误转换为无效?的更多相关文章

  1. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  2. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  3. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  4. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  5. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  6. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  7. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  8. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  9. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  10. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

随机推荐