当前位置: 首页 > 知识库问答 >
问题:

在临时对象上调用左值ref限定成员函数时GCC错误消息的措辞

隆礼骞
2023-03-14

以下代码不编译,没想到:

struct A {
    void doWork() & {}
};
int main() {
    A{}.doWork();
}

我的理解是,临时A{}不能绑定到

类X的成员函数处理如下:

  • 无ref限定符:隐式对象参数具有对cv限定X的类型左值引用,并且还允许绑定右值隐式对象参数
  • 左值引用限定符:隐式对象参数具有对cv限定X的类型左值引用,不允许绑定右值隐式对象参数
  • rvalue ref限定符:隐式对象参数的类型rvalue reference指向cv限定X

我在Vim中使用的clangd也告诉我

this”成员函数“doWork”的参数是一个右值,但函数具有非const左值ref限定符deleteme。cpp:2:10:注:“doWork”在此声明[成员功能调用错误参考]

然而,当我使用GCC编译时,我会遇到以下错误:

$ g++ -std=c++17 deleteme.cpp && ./a.out
deleteme.cpp: In function ‘int main()’:
deleteme.cpp:16:16: error: passing ‘A’ as ‘this’ argument discards qualifiers [-fpermissive]
   16 |     A{}.doWork();
      |                ^
deleteme.cpp:5:10: note:   in call to ‘void A::doWork() &’
    5 |     void doWork() & {
      |          ^~~~~~

这似乎与错误的关联性不如clangd中的错误。

另一方面,我读过这两个词,丢弃限定符,当在const对象上错误地调用const成员函数时;在这种情况下,我理解“丢弃”的使用,因为该对象具有函数无法遵守的const,因此应该丢弃它以使事情正常工作。

但是,上面的代码似乎不是这种情况,我知道问题是A{}的右值-ness与doWork()的左值-ness相比

GCC错误的措辞是错误的还是我误读了?


共有1个答案

王旺
2023-03-14

这只是GCC中措辞次优的错误消息的一种情况。

我的猜测是,在GCC的实现中,诊断不同ref限定符之间的不匹配与诊断常量和非常量之间的不匹配共享一些代码,并且它们重用了相同的错误消息。

我鼓励您提交一个GCC错误,建议对错误消息进行改进。

 类似资料:
  • 当一个类具有 constexpr 成员函数并且该成员函数正在 constexpr 上下文中的 l 值对象上求值时,clang 和 gcc 不同意结果是否为 constexpr 值。为什么?是否有既不需要默认可构造性也不需要复制可构造性的解决方法? 当对象按值传递时,两个编译器都会成功编译。 Clang版本trunk,8,7: 和 gcc 版本主干,8.1、7.4:编译没有错误 https://go

  • 请帮帮我 致命错误:在第104行的/home/u357965800/public_html/include/class.admin.php中对非对象调用成员函数prepare()

  • 问题内容: 我正在尝试执行一些查询以获取有关某些图像的信息页面。我写了一个函数 根据这些图片的受欢迎程度选择页面。我已经编写了一个处理与数据库交互的类,并保存了有关图像的信息。当我尝试运行此程序时,出现错误。 是mysqli结果集,所以我对为什么它不起作用感到困惑。 问题答案: 那是因为您的查询中有错误。 错误时将返回false。将其更改为: 如果有错误,那应该抛出异常…

  • 我想在数据库中存储用户配置数据,我正在关注这个论坛的帖子http://forumsarchive.laravel.io/viewtopic.php?id=10406但当我实现它时,laravel抛出了一个错误。我运行了composer dump autoload,但似乎没有任何功能。这里有什么问题? //文件名:app/config/settings。php 用法: echo Config::ge

  • 所以我有2个表:管理员和雇员只有2列他们共同分享 一份登入表格 和2个独立的仪表板 为了将它们临时放在一个表中,我将它们与UNION合并,并添加了一个临时列来定义用户的类型,从而登录到正确的仪表板。 因此,在经过长时间的搜索和大量的跟踪和错误之后,我得出结论,这是我作为一个新手在这个领域所能做和理解的最好的事情。 这就是我最后一篇文章的样子: 使用的代码来自一个用于记录一个用户的教程,它对我来说很

  • 我尝试了一些代码来使用PHP和slim框架构建RESTful API Web服务。(我正在使用高级Rest客户端测试此代码) 这是我的密码。