"const"、"&" 和 "&&"如何影响无参数函数的重载?
How do "const", "&", and "&&" affect overloading of a parameterless function?
考虑一个定义如下的类:
struct A
{
void f();
void f() const;
void f() &;
void f() const &;
void f() &&;
void f() const &&;
};
两者之间有什么区别:
1) 无效 A::f(); 和无效 A::f() 和;(请注意这一点!
2) 无效 A::f() 常量;和无效 A::f() 常量 &;
3) 无效 A::f() &&;和无效 A::f() 常量 &&;
您可以将这些转换为
void f(A&);
void f(const A&);
void f(A&);
void f(const A&);
void f(A&&) &&;
void f(const A&&);
第一个是特殊的 - 它是一个A&
,但仍然接受右值,不像其他非常量左值引用。在所有其他方面,它与具有A&
参数的任何其他函数相同。
第二个(const
)和第四个(const&)
)之间的过载分辨率没有区别,除非它们分别与一个(&&
竞争)。我不认为普通函数会发生这种情况,而只会发生在转换函数上,因为标准禁止这种情况(一般来说,如果当前范围内有任何带有 ref 限定符的函数,则所有函数都必须)
void f();
void f() &&;
但是使用转换函数,您仍然可以同时设置operator int()
和operator long()&&
的过载分辨率。在这种情况下,即使调用它们的对象是R()
(右值),如果需要转换为 int
,也将使用第一个转换函数。
-
f()
是f() const
的正常函数,this
必须指向可修改的 lval -
f() const
是一个常量函数(无法更改),f() const &
是相同的,但保证这也是一个 lval -
f()&&
这必须是 的临时值,f() const &&
这必须是您无法修改的临时值
相关文章:
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类