成员函数声明的参数列表后面的单个"与"是什么意思
What does the single ampersand after the parameter list of a member function declaration mean?
根据此处的答案。
class wrap {
public:
operator obj() const & { ... } //Copy from me.
operator obj() && { ... } //Move from me.
private:
obj data_;
};
我知道&&
意味着当对象是右值引用时,成员将被调用。但是,单安培数是什么意思?它与没有安培数有什么不同?
这意味着当对象是左值引用时,将调用成员。
[C++11: 9.3.1/5]:
可以用ref限定符(8.3.5)声明非静态成员函数;见13.3.1。
[C++11: 13.3.1/4]:
对于非静态成员函数,隐式对象参数的类型为
- "对cv
X
的左值引用",适用于未使用ref限定符或使用&
ref限定符声明的函数- 使用
&&
ref限定符声明的函数的"对cvX
的右值引用">其中
X
是函数为其成员的类,cv是成员函数声明上的cv限定[..](还有一些我找不到的规则)
如果没有ref限定符,函数总是可以被调用,而不管调用它的表达式的值类别是什么:
struct foo
{
void bar() {}
void bar1() & {}
void bar2() && {}
};
int main()
{
foo().bar(); // (always fine)
foo().bar1(); // doesn't compile because bar1() requires an lvalue
foo().bar2();
foo f;
f.bar(); // (always fine)
f.bar1();
f.bar2(); // doesn't compile because bar2() requires an rvalue
}
现场演示(感谢Praetorian)
但是单和号是什么意思?
函数只能在左值上调用,而不能在右值上调用。
它与没有"与"符号有什么不同?
如果没有ref限定符,您可以在左值或右值上调用函数。
使用ref限定符,您只能调用相应值类别上的函数。
一个没有ref限定符的函数可以同时为右值和左值调用。带有&&
ref限定符的函数只能为右值调用。带有&
ref限定符的函数只能为lvalues调用。
class No { void foo(); };
class L { void foo() &; };
class R { void foo() &&; };
No().foo(); // valid
No no; no.foo(); // valid
L().foo(); // invalid
L l; l.foo(); // valid
R().foo(); // valid
R r; r.foo(); // invalid
不幸的是,我只能在5.5/6中找到这个规则,它只适用于指向成员的指针解引用表达式。我知道它也适用于其他情况。
此外,您不能在引用限定符与无引用限定符之间过载,请参阅13.1/2项目符号3。您可以在&
和&&
上过载。
(由于我对标准的搜索没有结果,LRiO的答案现在也包含了所有这些信息。)
相关文章:
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- "类模板示例<int>;"语句对 C++11 是什么意思?
- 线应该是什么意思
- 错误:无效的预处理指令 #i 的意思是 #if?
- "CID"在AT+HTTPPARA= "CID" ,1中是什么意思
- 表达式"b=(b-x)&x"是什么意思?
- 这个表达是什么意思?
- 此代码验证公式是什么意思?
- 跟踪日志中的T.11803()是什么意思?
- Trie*& 和 Trie** 的意思是 Same?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- * 和 ** 在 C++ 函数声明中是什么意思?
- _T("xyz")是什么意思?
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 这行代码到底是什么意思?
- 在命名空间名称之前加上 :: 是什么意思?
- 从字符数组的元素中减去'a'是什么意思
- "friend"关键字在C++中是什么意思?