预期以下代码无法编译:
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;在这种情况下,我理解“丢弃”的使用,因为该对象具有该功能无法兑现的,因此应该丢弃它以使事情正常工作。const
const
const
但是,对于上面的代码,情况似乎并非如此,据我了解,问题在于与预期A{}
的左值相比的右值。doWork() &
来自 GCC 的错误的措辞是错误的还是我误读了它?