在 C++ 中,不能在一个类中用没有 ref-qualifier 的成员函数重载带有 ref-qualifier 的成员函数。但同时可以从父类继承一个成员函数并在子类中重载它,如示例所示:
struct A {
void f() {}
//void f() & {} //overload error everywhere
};
struct B : A {
using A::f;
void f() & {} //ok everywhere
};
int main() {
B b;
b.f(); //ok in GCC only
}
Run Code Online (Sandbox Code Playgroud)
只是在调用的过程中f,Clang抱怨道call to member function 'f' is ambiguous。但GCC接受程序没有任何错误,演示: https: //gcc.godbolt.org/z/5zzbWcs97
这里是哪个编译器?
c++ overloading language-lawyer ref-qualifier function-qualifier
考虑这个类:
#include <vector>
class A {
private:
std::vector<int> m_vector;
public:
void insertElement(int i) {
m_vector.push_back(i);
}
const std::vector<int>& getVectorRef() const {
return m_vector;
}
};
Run Code Online (Sandbox Code Playgroud)
该方法getVectorRef线程安全吗?
是否有可能在另一个线程返回期间getVectorRef弹出并调用,insertElement从而导致成员向量发生更改并且调用者getVectorRef获得错误的 const 引用?
两个 const 限定符(一个用于向量,另一个用于成员函数)在线程安全上下文中没有意义吗?
struct BananaHolder
{
vector<Banana>& getBananas();
const vector<Banana>& getBananas() const;
};
Run Code Online (Sandbox Code Playgroud)
我的课程充满了这种重复。
有没有更干净、更优雅的替代方案?
c++ getter c++11 function-qualifier explicit-object-parameter
所以我最近接触到了C++中所谓的“令人厌恶的函数类型”的怪诞(据我所知源自这篇论文:https ://www.open-std.org/jtc1/sc22/wg21/文档/论文/2015/p0172r0.html)。我想了一会儿,它似乎确实有一定的道理,但如果有人以某种方式将它们从语言中完全删除,一切都会变得更加干净和更令人满意。
也许还有其他来源,但是(至少对我来说)令人讨厌的函数类型的大多数问题都来自于处理成员函数。如果我想获取成员函数的类型,我会这样做:
template <typename T>
struct remove_ptr_to_member { using type = T; };
template <typename T, typename class_t>
struct remove_ptr_to_member<T class_t::*> { using type = T; };
struct container {
void func() const;
};
using member_function_type = typename remove_ptr_to_member<decltype(container::func)>::type;
Run Code Online (Sandbox Code Playgroud)
const由于的声明中存在 a func(),删除指向成员的指针部分会给我们留下一个令人讨厌的函数。
this如果将不可见参数放入成员函数的类型中,则可以避免这种情况。然后,通常会导致令人讨厌的函数的东西都将应用于参数this(const意味着一个const this指针,&&意味着对 实例的右值引用this,等等......)。
现在,即使删除类型的指向成员的指针部分,剩下的也只是完全正常的函数类型。这样做的好处是,它会减少您在实现诸如is_function.
经典方法:
// primary template
template<class>
struct is_function : std::false_type { };
// specialization for regular functions …Run Code Online (Sandbox Code Playgroud) 我读过 const 的用例,我觉得我对 const 的大部分都有很好的理解。但是,我似乎无法弄清楚为什么我不经常看到这种情况:
void someFunction(const string& A) const
Run Code Online (Sandbox Code Playgroud)
const 成员函数中有 const 参数。出于某种原因,每当我查找示例并且该函数是 const 时,const 似乎都被从参数中删除,如下所示:
void someFunction(string& A) const
Run Code Online (Sandbox Code Playgroud)
然而,这似乎并没有阻止我修改 A。在 const 成员函数中使用 const 参数是否被认为是不好的形式?
如果 A 不被修改,那么参数中不保留 const 的原因是什么?
编辑:这是我没有澄清的错误,但我理解在参数之前添加它和在函数之后添加它之间的区别。我看过的很多代码都没有将两者结合起来,我只是想弄清楚这是否有原因。