1

预期以下代码无法编译:

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

我的理解是临时A{}不能绑定到&-qualified 成员函数,这似乎与cppreferencedoWork的摘录一致(我的斜体):

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

  • 没有引用限定符:隐式对象参数具有对 cv 限定 X 的类型左值引用,并且还允许绑定右值隐式对象参数
  • lvalue ref-qualifier:隐式对象参数具有对 cv-qualified X 类型的左值引用,并且不允许绑定右值隐式对象参数
  • rvalue ref-qualifier:隐式对象参数具有对 cv 限定 X 的类型 rvalue 引用

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

this成员函数“ ”的“ ”参数doWork是右值,但函数具有非const左值引用限定符 deleteme.cpp:2:10:注意:“ doWork”在此处声明 [member_function_call_bad_ref]

但是,当我使用 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

另一方面,当错误地在object上调用成员函数时,我已经阅读了这两个词, discards qualifiers;在这种情况下,我理解“丢弃”的使用,因为该对象具有该功能无法兑现的,因此应该丢弃它以使事情正常工作。constconstconst

但是,对于上面的代码,情况似乎并非如此,据我了解,问题在于与预期A{}的左值相比的右值。doWork() &

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

4

1 回答 1

1

这只是 GCC 中措辞欠佳的错误消息的一个例子。

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

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

于 2020-11-09T01:23:23.217 回答